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

C# 动态创建的按钮单击事件未触发,c#,asp.net,C#,Asp.net,我对此做了一些研究,但我发现的任何解决方案似乎都不能解决我的问题。我在C#中有一个asp.net web应用程序,我想在从下拉列表中选择后动态添加一个提交按钮 protected void Page_Load(object sender, EventArgs e) { submitButton.Text = "Submit"; submitButton.ID = "submitButton"; submitButton.Click += new EventHandler(

我对此做了一些研究,但我发现的任何解决方案似乎都不能解决我的问题。我在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中总是有点棘手。

与其动态添加控件,不如始终添加它,但在开始时设置
Visible=false
。那么,您当前在哪里添加它,而只是让它可见


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

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

<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" ...>
SomePanel.Controls.Add(Button1);
  • 页面加载被执行,页面被呈现
  • 选择下拉列表。回发被发送到服务器。执行页面加载。然后将事件发送到下拉实例。执行SelectedIndexChanged。按钮被创建,页面被呈现并发送到客户端
  • 按钮被按下。回发被发送到服务器。执行页面加载。Asp尝试执行事件,但按钮不再存在。因此该事件被忽略

这是Webforms令人讨厌的细节之一,也是不使用它的一个很好的理由——如果你可以自由选择的话。如果必须使用它,可能会有所帮助。

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

<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" ...>
SomePanel.Controls.Add(Button1);
  • 页面加载被执行,页面被呈现
  • 选择下拉列表。回发被发送到服务器。执行页面加载。然后将事件发送到下拉实例。执行SelectedIndexChanged。按钮被创建,页面被呈现并发送到客户端
  • 按钮被按下。回发被发送到服务器。执行页面加载。Asp尝试执行事件,但按钮不再存在。因此该事件被忽略

这是Webforms令人讨厌的细节之一,也是不使用它的一个很好的理由——如果你可以自由选择的话。如果您必须使用它,可能会有所帮助。

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

试试这个:

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(在服务器上)和事件处理程序都将保持不变

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

试试这个:

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中创建按钮。

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

如果要在WebForms中动态创建控件,则必须在每次回发时以及加载ViewState之前重新创建控件。否则,将导致ViewState损坏/损坏。此外,我认为事件最迟需要在页面中附加。OnLoad(EventArgs e)才能触发事件。

如果在WebForms中动态创建控件,则每次回发时以及加载ViewState之前都必须重新创建它们。否则,将导致ViewState损坏/损坏。另外,我认为事件最迟需要在页面中附加。OnLoad(EventArgs e)让它们启动。

我有一种感觉,我最终要做的是更改可见性属性。我希望有一种方法可以动态地开始工作,但似乎比必要的更令人沮丧。我希望我能不止一次地对这个答案投赞成票。在ASP.NET中,隐藏/显示或启用/禁用操作比动态控件更容易管理。我有一种感觉,就是我最终要做的就是更改可见性属性。我希望有一种方法可以动态地开始工作,但似乎比必要的更令人沮丧。我希望我能不止一次地对这个答案投赞成票。在ASP.NET中,隐藏/显示或启用/禁用操作比动态控件更易于管理。它将动态添加到我的switch语句中,并且仍将产生相同的结果。它不会动态添加到交换机中。它会动态地移动到面板中,但是按钮本身不会在switch语句中动态创建,除非您省略了一些代码。如果代码只执行了这些操作,则不必重新分配ID或事件处理程序。它将动态添加到my switch语句中,并且仍将产生相同的结果。它不会动态添加到开关中。它会动态地移动到面板中,但按钮会移动它