我有一个动态创建的按钮,该按钮被添加到依赖于usercontrol的更新面板中。我有一个不可能的时间提高此按钮的点击事件。基本上情况如下(简化)。
我在这里生成动态按钮:
protected override void OnPreRender(System.EventArgs e)
{
BuildDynamicControls();
base.OnPreRender(e);
}
我也试过在这里构建按钮:
protected override void OnInit(System.EventArgs e)
{
BuildDynamicControls();
base.OnInit(e);
}
哪个电话:
private void BuildDynamicControls();
{
Button button = new Button();
button.ID = "test";
button.click += new EventHandler(dynamicButton_Click);
updatePanel.ContentTemplateContainer.Controls.Add(button);
}
和点击事件:
void dynamicButton_Click
{
// do stuff. Never hits the break point here.
}
答案 0 :(得分:0)
ASP.NET中的事件处理程序早在OnPreRender阶段之前就被调用了,所以当ASP.NET试图找出点击了哪个按钮时,你的按钮不会“存在”。
尝试在Init阶段构建动态控件。
答案 1 :(得分:0)
如果您查看page life cycle,您会发现在加载偶数和渲染之前触发了页面中的事件。
因此,在您的示例中,将在负责触发事件的阶段之后创建按钮。
要解决此问题,请将调用BuildDynamicControls()
移至页面中的Load事件处理程序。
来自MSDN:
负载: Page对象调用Page对象上的OnLoad方法,然后递归地为每个子控件执行相同操作,直到加载页面和所有控件。单个控件的Load事件发生在页面的Load事件之后。 使用OnLoad事件方法在控件中设置属性并建立数据库连接。
控件事件:使用这些事件来处理特定的控件事件,例如Button控件的Click事件或TextBox控件的TextChanged事件。
PreRender:在Page对象创建了呈现页面所需的所有控件(包括复合控件的子控件)之后引发。 (为此,Page对象为每个控件和页面调用EnsureChildControls。)
答案 2 :(得分:0)
This article描述了调试它的方法。它非常相似。
但是,我注意到您的代码存在一个问题。您的base.OnInit(e)
作为重写方法的第一行。尝试按以下方式切换它们。
protected override void OnInit(System.EventArgs e)
{
base.OnInit(e);
BuildDynamicControls();
}
答案 3 :(得分:0)
我过于简单的例子......过于简化了。
问题在于,每次生成动态按钮时,它都会收到一个全新的ID,该ID与回发的按钮的ID不同。
感谢大家的帮助。