在用户控件的更新面板内的动态按钮上单击事件

时间:2011-05-02 20:41:11

标签: c# asp.net

我有一个动态创建的按钮,该按钮被添加到依赖于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.
}

4 个答案:

答案 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不同。

感谢大家的帮助。