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

时间:2011-08-23 16:54:14

标签: 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(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();
}

5 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:3)

如何而不是动态添加控件,始终添加它,但最初设置Visible=false。那么你当前正在添加它,而只是让它可见?

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

答案 2 :(得分:0)

从您发布的示例中,它看起来不像按钮是动态的;看起来你只是动态地分配事件处理程序。如果是这种情况,则每次页面回发时都不需要重新分配事件处理程序。就此而言,如果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(在服务器上)并且事件处理程序将保持不变,无论你在哪里移动控制权。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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