向下和到点问题。我有一些动态创建按钮的悲惨时光。他们不想触发我为他们设置的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.
}
我有这个当前的功能。它需要能够以图形方式重新排序,删除和添加项目。
答案 0 :(得分:1)
只是...不要使用动态ASP控件。永远。他们超级难以使用,并且有更好的选择。
如果您想根据已使用Repeater
的某些数据创建动态数量的控件,或者,如果您想专门创建数据表,则为DataGrid
。这些都有明智的行为,并且远更容易使用。
如果您有可选择呈现的内容,例如可能需要或可能不需要显示的单个固定按钮,请在标记中定义该控件并使用Visible
属性确定它是否为实际上发送给最终用户。
至于为什么它不起作用,ASP在页面的生命周期中有很多步骤。其中一个早期步骤是初始化它的页面视图,其中包含所有项目。在稍后的时间点检查回发数据,触发的任何事件在页面视图中找到它们相应的控件,然后为该事件运行相应的处理程序。在您的情况下,您正在创建控件并在请求的“页面视图”已经完成后添加处理程序。代码没有看到你的按钮或任何处理程序,所以它没有任何处理程序可以运行。
如果动态控件的创建依赖于从用户发回的信息(这实际上似乎就是这种情况),这一切都变得复杂了。如果您在生命周期中尽早创建控件以使它们能够触发事件,那么您需要从用户刚刚完成的内容中获取的信息尚未填充到相应的ASP构造中。在实际访问构造它们的信息之前,最终会被迫构造动态对象。
答案 1 :(得分:0)
Page_Load可能已经太晚了,在ASP.NET生命周期中,你应该使用CreateChildControls方法动态创建控件。
动态生成的控件和未被触发的事件的常见问题是(编辑:第二个子弹可能是您的问题,因为您提到了控件的重新排序;同样在您提交图片时,转发器似乎更好这个想法,正如Servy提出的那样: