创建动态asp控件

时间:2014-08-21 20:05:13

标签: c# asp.net dynamic asp.net-3.5 page-lifecycle

向下和到点问题。我有一些动态创建按钮的悲惨时光。他们不想触发我为他们设置的Click事件。我的代码的解释如下。任何人都可以提供一些有关我的动态控件不起作用的见解吗?

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.
}

我有这个当前的功能。它需要能够以图形方式重新排序,删除和添加项目。

enter image description here

2 个答案:

答案 0 :(得分:1)

只是...不要使用动态ASP控件。永远。他们超级难以使用,并且有更好的选择。

如果您想根据已使用Repeater的某些数据创建动态数量的控件,或者,如果您想专门创建数据表,则为DataGrid。这些都有明智的行为,并且更容易使用。

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

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

如果动态控件的创建依赖于从用户发回的信息(这实际上似乎就是这种情况),这一切都变得复杂了。如果您在生命周期中尽早创建控件以使它们能够触发事件,那么您需要从用户刚刚完成的内容中获取的信息尚未填充到相应的ASP构造中。在实际访问构造它们的信息之前,最终会被迫构造动态对象。

答案 1 :(得分:0)

Page_Load可能已经太晚了,在ASP.NET生命周期中,你应该使用CreateChildControls方法动态创建控件。

动态生成的控件和未被触发的事件的常见问题是(编辑:第二个子弹可能是您的问题,因为您提到了控件的重新排序;同样在您提交图片时,转发器似乎更好这个想法,正如Servy提出的那样:

  • 如果您忘记将ID分配给控件,ASP.NET可以生成 客户端上的控件的不同ID和处理程序不会 在服务器上调用(你有覆盖)
  • 如果控件的层次结构在回发时发生更改,ASP.NET将无法在控制树中找到控件,因此不会再次调用处理程序(服务器上的控件由索引匹配,而不是名称!)。您可以比较页面的第一个渲染和回发之间的page trace of control tree。您应该确保控制树在回发之间没有区别(例如,您不应该跳过在回发时向页面添加控件,而是将它们包含在控制树中,但不显示它们)。