2012-05-23 60 views
1

我收到了有关在一组updatepanel上添加动态按钮事件的查询。将动态按钮添加到更新面板并绑定onclick事件ASP.net Webforms

我已经简化了这个场景,因为我到目前为止所使用的代码太长了,并且连接起来了。我创建了一个包含3个更新面板的测试页面。

就实际页面而言,第一个更新面板将用于过滤器,它将依次更新第二个更新面板。第二个更新面板将包含所有结果,具体取决于过滤器......这将是一个按钮表。

点击第二个更新面板上的这些按钮中的任意一个,根据按钮的ID,结果将在上一次更新面板中生成。

我正面临的问题是在创建按钮时绑定按钮单击事件。 当我从第一个更新面板的onclick创建按钮时,它将它添加到占位符中,但点击事件根本不会触发。

这里是我的测试页面的一些代码。

Test.aspx的

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
</asp:ScriptManager> 

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
<ContentTemplate> 
    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" /> 
</ContentTemplate> 

</asp:UpdatePanel> 


<asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="False" 
    UpdateMode="Conditional"> 
<ContentTemplate> 

<asp:PlaceHolder id="ph2" runat="server"></asp:PlaceHolder> 
</ContentTemplate> 

</asp:UpdatePanel> 


<asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional"> 

<ContentTemplate> 
<asp:PlaceHolder id="ph3" runat="server"></asp:PlaceHolder> 
</ContentTemplate> 

</asp:UpdatePanel> 

代码隐藏:

public partial class test : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     Button up2button = new Button(); 
     up2button.ID = "up2button"; 
     ph2.Controls.Add(up2button); 
     up2button.Click += new EventHandler(up2button_Click); // Not being registered? 

     AsyncPostBackTrigger trigger1 = new AsyncPostBackTrigger(); 
     trigger1.ControlID = "up2button"; 
     trigger1.EventName = "Click"; 
     UpdatePanel2.Triggers.Add(trigger1); 

     ScriptManager1.RegisterAsyncPostBackControl(up2button); 

     UpdatePanel2.Update(); 

    } 

    protected void up2button_Click(object sender, EventArgs e) { //and not being fired 
     Button up3button = new Button(); 
     up3button.ID = "up3button"; 
     up3button.Click += new EventHandler(up3button_click); 
     ph3.Controls.Add(up3button); 


     AsyncPostBackTrigger trigger1 = new AsyncPostBackTrigger(); 
     trigger1.ControlID = "up3button"; 
     trigger1.EventName = "Click"; 
     UpdatePanel3.Triggers.Add(trigger1); 
     UpdatePanel3.Update(); 
    } 

    protected void up3button_click(object sender, EventArgs e) { 


    } 
} 

谢谢你们的时间。

回答

0

这里有一个快速的样品,我在互联网上找到:

我用了一个占位符来保存动态创建的控件 - 该按钮的点击事件的按钮和文本框。

,代码:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      if (ViewState["Add"] != null) 
      { 
       Button add = new Button(); 
       add.Text = "Add"; 
       add.Click += new EventHandler(add_Click); 
       PlaceHolder1.Controls.Add(add); 
      } 
      if (ViewState["textboxes"] != null) 
      { 
       int count = 0; 
       count = (int)ViewState["textboxes"]; 
       for (int i = 0; i < count; i++) 
       { 
        textbox textbox_foradd = new TextBox(); 
        textbox_foradd.ID = "textadd" + (i + 1).ToString(); 
        PlaceHolder1.Controls.Add(textbox_foradd); 
       } 
      } 
     } 

    } 

    void add_Click(object sender, EventArgs e) 
    { 
     int count = 1; 
     if (ViewState["textboxes"] != null) 
     { 
      count += Convert.ToInt32(ViewState["textboxes"]); 
     } 
     TextBox textbox_foradd = new TextBox(); 
     textbox_foradd.ID = "textadd" + count.ToString(); 
     PlaceHolder1.Controls.Add(textbox_foradd); 
     ViewState["textboxes"] = count; 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     Button add = new Button(); 
     add.Text = "Add"; 
     PlaceHolder1.Controls.Add(add); 
     ViewState["Add"] = 1; 
    } 
0

此外,你需要给唯一的ID给每个控制的情况下,你添加相同的多个控制。

例: ID为“按钮a” Add按钮添加另一个按钮,ID“按钮a”

会失败,回传后您的按钮将正确地触发事件,但动作不会做一个适当的刷新。 使它看起来不再令人耳目一新。

而是为您动态添加的每个控件生成一个唯一的ID(并保存这些ID)。 在回发中,重新创建这些控件并正确重新分配ID。 只有这样UI才能正常刷新。

相关问题