动态创建按钮单击事件未触发

我已经对此做了一些研究,但我找到的解决方案似乎都没有解决我的问题。 我在C#中有一个asp.net Web应用程序,我想在从下拉列表中选择后动态添加提交按钮。

protected void Page_Load(object sender, EventArgs e) { submitButton.Text = "Submit"; submitButton.ID = "submitButton"; submitButton.Click += new EventHandler(submitButton_Click); SelectionDropDownList.SelectedIndexChanged += new EventHandler(SelectionDropDownList_SelectedIndexChanged); } protected void SelectionDropDownList_SelectedIndexChanged(object sender, EventArgs e) { switch (SelectionDropDownList.SelectedIndex) { case 1: //does a redirect break; case 2: Panel1.Controls.Add(submitButton); break; case 3: //does a redirect break; } } protected void submitButton_Click(object sender, EventArgs e) { //can't get this event to fire. SubmitSearch(); } 

如何而不是动态添加控件,总是添加它,但最初设置Visible=false 。 然后你正在添加它的地方,而只是让它可见?

动态控件在webforms中总是有点棘手。

这是一个时间问题。 你的程序流程是这样的:

  • 执行Page_Load,呈现页面。
  • 下拉菜单已被选中。 回发后发送到服务器。 Page_Load已执行。 然后将事件发送到您的下拉列表实例。 SelectedIndexChanged被执行。 您的按钮已创建,页面将呈现并发送给客户端。
  • 按钮被按下。 回发后发送到服务器。 Page_Load已执行。 Asp尝试执行该事件,但该按钮不再存在。 所以事件被忽略了。

这是Webforms令人讨厌的细节之一,也是不使用它的好理由 – 如果你可以自由选择的话。 如果你必须使用它, http://msdn.microsoft.com/en-us/library/ms178472.aspx可能会有所帮助。

尝试在案例2中创建一个按钮。

如果您在WebForms中动态创建控件,则必须在每次回发时以及加载ViewState之前重新创建它们。 否则你最终会破坏/破坏ViewState。 另外,我认为最近需要在Page.OnLoad(EventArgs e)中附加事件才能触发它们。

从您发布的示例中,它看起来不像按钮是动态的; 看起来你只是动态地分配事件处理程序。 如果是这种情况,则每次页面回发时都不需要重新分配事件处理程序。 就此而言,如果ID已经在标记中定义,则不应重新分配ID。

试试这个:

 if (!Page.IsPostBack) { Button1.Click += new EventHandler(Button1_Click); } 

编辑

从代码的外观来看,处理您的情况的正确方法是将控件放在面板中,并在下拉列表的选定索引发生更改时切换面板的可见性。

 protected void DropDown1_SelectedIndexChanged(object sender, EventArgs e) { Panel1.Visible = SomeIntValue == 2; } 

根据您当前的代码:

如果我在标记中创建一个按钮,如下所示:

  

在后面的代码中,我尝试将控件移动到另一个面板,如下所示:

 SomePanel.Controls.Add(Button1); 

这不是你正在做的事情的正确方法,但从技术上讲,ID(在服务器上)和事件处理程序将保持完整,无论你试图将控件移动到何处。