[英]dynamically created button click event not firing
我对此进行了一些研究,但是发现的解决方案似乎都无法解决我的问题。 我在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();
}
这是一个时间问题。 您的程序流程如下:
那是Webforms令人讨厌的细节之一,也是不使用它的一个很好的理由-如果您可以自由选择的话。 如果必须使用它, http://msdn.microsoft.com/zh-cn/library/ms178472.aspx可能会有所帮助。
总是动态添加控件,而不是动态添加控件,而是先设置Visible=false
。 然后,您当前在何处添加它,而不是使其可见?
动态控件在Web窗体中总是有些棘手。
在您发布的示例中,按钮看起来不是动态的; 看起来您只是在动态分配事件处理程序。 如果是这种情况,则无需在页面每次回发时都重新分配事件处理程序。 因此,如果该ID已在标记中定义,则您也不应重新分配该ID。
尝试这个:
if (!Page.IsPostBack)
{
Button1.Click += new EventHandler(Button1_Click);
}
编辑
从代码的外观来看,处理您的情况的正确方法是将控件放入面板中,并在下拉列表的选定索引更改时切换面板的可见性。
protected void DropDown1_SelectedIndexChanged(object sender, EventArgs e)
{
Panel1.Visible = SomeIntValue == 2;
}
根据您当前的代码:
如果我在标记中创建一个按钮,如下所示:
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" ...>
在后面的代码中,我尝试将控件移至另一个面板,如下所示:
SomePanel.Controls.Add(Button1);
这不是执行您要执行的操作的正确方法,但从技术上讲,无论您将控件移至何处,ID(在服务器上)和事件处理程序都将保持不变。
尝试在情况2中创建一个按钮。
如果要在WebForms中动态创建控件,则必须始终在每次回发时以及在加载ViewState之前重新创建它们。 否则,您将导致ViewState损坏/损坏。 另外,我认为事件必须最迟在Page.OnLoad(EventArgs e)中附加,以使其触发。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.