繁体   English   中英

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

[英]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();
}

这是一个时间问题。 您的程序流程如下:

  • Page_Load被执行,页面被渲染。
  • 选择下拉菜单。 回发到服务器。 Page_Load被执行。 然后,事件将发送到您的下拉实例。 SelectedIndexChanged被执行。 您的按钮已创建,页面已呈现并发送给客户端。
  • 按下按钮。 回发到服务器。 Page_Load被执行。 ASP尝试执行该事件,但是该按钮不再存在。 因此该事件被忽略。

那是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM