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

本文关键字:按钮 动态 单击 event 用户 控件 更新 | 更新日期: 2023-09-27 17:54:10

我有一个动态创建的按钮,它被添加到位于用户控件上的更新面板上。我有一个不可能的时间为这个按钮引发点击事件。基本上,场景如下(简化)。

我在这里生成动态按钮:

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

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

ASP中的事件处理程序。. NET早在OnPreRender阶段之前就被调用了,所以你的按钮在asp.net调用按钮时并不"存在"。. NET试图找出哪个按钮被点击了。

尝试在Init阶段构建动态控件

如果您查看页面生命周期,您会发现页面中的事件是在加载之后甚至在呈现之前触发的。

因此,在您的示例中,按钮将在负责触发事件的阶段之后创建。

要解决这个问题,请将调用BuildDynamicControls()移动到页面中的Load事件处理程序。

从MSDN:

加载:Page对象调用Page对象上的OnLoad方法,然后递归地对每个子控件执行相同的操作,直到加载页面和所有控件。单个控件的Load事件发生在页面的Load事件之后。使用OnLoad事件方法来设置控件中的属性和建立数据库连接。

控件事件:使用这些事件来处理特定的控件事件,例如Button控件的Click事件或TextBox控件的TextChanged事件。

PreRender:在Page对象创建了呈现页面所需的所有控件(包括复合控件的子控件)之后引发。(要做到这一点,Page对象为每个控件和页面调用ensurechildcontrols。)

本文描述了调试它的方法。

然而,我注意到你的代码有一个问题。您的base.OnInit(e)作为重写方法的第一行。试着像下面这样切换它们。

    protected override void OnInit(System.EventArgs e)
    {
base.OnInit(e);
         BuildDynamicControls();
    }

我的过度简化的例子…过于简化了。

问题是,每次生成动态按钮时,它都会收到一个全新的ID,该ID与返回按钮的ID不同。

谢谢大家的帮助