2011-08-23 120 views
1

我对此做了一些研究,但没有找到任何解决方案似乎可以解决我的问题。我在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(); 
} 

回答

3

怎么样,而不是动态地添加控件,总是添加它,但最初设置Visible=false。那么你现在添加它的地方,而只是使其可见?

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

+0

我有一种感觉,就是我最终会去改变可见性属性。我希望有一种方式可以动态地工作,但似乎比必要的更令人沮丧。 – Spacemancraig

+0

我希望我可以多次提出这个答案。隐藏/显示或启用/禁用操作在ASP.NET中比动态控件更容易管理。 – mikemanne

7

这是一个计时问题。你的程序流程如下:

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

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

0

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

试试这个:

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(在服务器上)和事件处理程序将保持不变,无论您尝试将控件移动到哪里。

+0

它在我的switch语句中动态添加,并且仍然会产生相同的结果。 – Spacemancraig

+0

它不会动态添加到交换机中。它被动态地移动到面板中,但是按钮本身不会在switch语句中动态创建,除非您省略了一些代码。如果这就是你所有的代码,你不应该重新分配ID或事件处理程序。 –

+0

@Spacemancraig:查看编辑答案。 –

0

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

0

如果您在WebForms中动态创建控件,则始终必须在每次回发和ViewState加载之前重新创建它们。否则,最终会出现损坏的ViewState。另外,我相信最新的事件需要附加在Page.OnLoad(EventArgs e)中以供他们触发。