2012-05-23 59 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才能正常刷新。

相關問題