Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建动态asp控件_C#_Asp.net_Dynamic_Asp.net 3.5_Page Lifecycle - Fatal编程技术网

C# 创建动态asp控件

C# 创建动态asp控件,c#,asp.net,dynamic,asp.net-3.5,page-lifecycle,C#,Asp.net,Dynamic,Asp.net 3.5,Page Lifecycle,直截了当的问题。我有一个痛苦的时间与一些动态创建的按钮。他们不想触发我为他们设置的单击事件。下面是对我的代码的解释。有人能提供一些关于为什么我的动态控件不工作的见解吗 protected void Page_Load(object sender, EventArgs e) { CreateButton(); } private void CreateButton() { Button btn = new Button(); btn.ID = "Button1";

直截了当的问题。我有一个痛苦的时间与一些动态创建的按钮。他们不想触发我为他们设置的
单击事件。下面是对我的代码的解释。有人能提供一些关于为什么我的动态控件不工作的见解吗

protected void Page_Load(object sender, EventArgs e)
{
    CreateButton();
}
private void CreateButton()
{
    Button btn = new Button();
    btn.ID = "Button1";
    btn.Click += Button1_Click;

    panel1.Controls.Add(btn);
}

protected void Button1_Click(object sender, EventArgs e)
{
    // Do stuff here.
    // Debugger never makes it to this point.
}
我现在有这个功能。它需要能够以图形方式重新排序、删除和添加项目


页面加载可能已经太晚了,在ASP.NET生命周期中,您应该使用一种方法动态创建控件

动态生成的控件和未触发的事件经常出现问题(编辑:第二个项目可能是您的问题,因为您提到了控件的重新排序;同样在您提交图片时,repeater似乎是更好的主意,正如Servy建议的那样):

  • 如果忘记将ID分配给控件,ASP.NET可以生成 客户端上控件的不同ID和处理程序将不会 在服务器上被调用(您已经讨论过了)
  • 如果控件的层次结构在回发时发生更改,ASP.NET将无法在控件树中找到控件,因此不会再次调用处理程序(服务器上的控件通过索引而不是名称进行匹配!)。您可以比较页面的第一次呈现和回发。您应确保回发之间的控件树没有差异(例如,您不应跳过回发时向页面添加控件,而应将它们包括在控件树中,但不显示它们)
只是…不要使用动态ASP控件。曾经他们非常难相处,而且有更好的选择

如果您想基于已有的某些数据创建动态数量的控件,请使用
中继器
,或者,如果您想专门创建数据表,请使用
数据网格
。这些都是明智的行为,更容易处理

如果您有要可选地呈现的内容,例如可能需要或不需要显示的单个固定按钮,则在标记中定义该控件,并使用
Visible
属性确定该控件是否实际发送给最终用户

至于为什么它不工作,ASP在页面的生命周期中有很多步骤。早期的步骤之一是初始化页面的视图,其中包含所有项目。在稍后检查回发数据时,任何触发的事件都会在页面视图中找到相应的控件,然后为该事件运行相应的处理程序。在您的例子中,您正在创建控件并在请求的“页面视图”已经完成之后添加处理程序。代码没有看到您的按钮,或者它的任何处理程序,因此它没有任何要运行的处理程序


如果动态控件的创建依赖于从用户发回的信息(这里的情况似乎确实如此),那么这就更加复杂了。如果您在生命周期中足够早地创建控件,使它们能够触发事件,那么您需要从用户刚刚完成的操作中获取的信息尚未填充到相应的ASP构造中。你最终被迫在你真正获得构建动态对象的信息之前构建动态对象。

你说的是什么意思“他们不想触发您设置的单击事件。”。。他们怎么知道你设置了什么。。请更清楚地说明你正在努力实现的目标。。阅读本文以及刚刚阅读的标题,我已经可以告诉您,解决方案就是不使用动态ASP控件。它们真是一场噩梦。@Servy我怎么能根据一系列的项目生成一个按钮呢?任何建议,因为我希望能够避免它们。@Volearix使用一个
中继器
。它们肯定不容易处理,但我在一个有很多动态控件的项目中工作,因为我们确实需要在运行时生成它们。这是一个非常强大的方法,但你肯定要做对。我在看中继器,我能创建一个界面,比如中继器提供的图像吗?@Volearix是的,你能,这比尝试使用动态控件要容易得多。好的,那么你有一个很好的来源/示例说明我如何实现这一点。我对中继器的使用完全不熟悉,从我所看到的一切来看,它们看起来都很复杂。@Volearix有很多关于使用中继器的教程可供选择。想法很简单;为标记中的单个项目创建一个模板,然后将数据与一些不同的项目绑定到repeater,repeater会将模板应用于每个项目。repeater工作了,花了一些时间理解这个想法,但这正是我需要的。