2013-01-15 106 views
1

我已提及Error with the event handlers of dynamic linkbutton。它說要在Page_InitPage_Load中添加事件處理程序。我厭倦了以下代碼。但是當我點擊動態添加的鏈接按鈕時,事件處理程序不會被觸發。這裏需要糾正哪些問題?EventHandler不適用於動態控制

注:動態LinkBut​​ton控件在一個按鈕的點擊事件增加了一些業務驗證後(業務代碼省略其給出)

標記

<form id="form1" runat="server"> 
<div> 
    <asp:LinkButton ID="lnkTest" runat="server" OnClick="LinkButton_Click">Static LinkButton</asp:LinkButton> 
    <br /> 
    <asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" /> 
    <br /> 
    <asp:PlaceHolder ID="plhDynamicLinks" runat="server"></asp:PlaceHolder> 
</div> 
</form> 

代碼背後

protected void Page_Load(object sender, EventArgs e) 
    { 

     foreach (Control ctrl in plhDynamicLinks.Controls) 
     { 
      LinkButton dynamicButton = (LinkButton)ctrl; 
      dynamicButton.Click += new EventHandler(LinkButton_Click); 
     } 

     if (Page.IsPostBack) 
     { 

     } 
    } 

    protected void Page_Init(object sender, EventArgs e) 
    { 
     int x = 0; 

     foreach (Control ctrl in plhDynamicLinks.Controls) 
     { 
      LinkButton dynamicButton = (LinkButton)ctrl; 
      dynamicButton.Click += new EventHandler(LinkButton_Click); 
     } 
    } 

    protected void LinkButton_Click(object sender, EventArgs e) 
    { 
     LinkButton clickedControl = (LinkButton)sender; 
     Response.Write(clickedControl.ID +" Link Button Clicked"); 
    } 

    protected void btnAdd_Click(object sender, EventArgs e) 
    { 
     plhDynamicLinks.Controls.Clear(); 

     LinkButton button1 = new LinkButton(); 
     button1.ID = "D1"; 
     button1.Text = "1"; 
     plhDynamicLinks.Controls.Add(button1); 

     LinkButton button2 = new LinkButton(); 
     button2.ID = "D2"; 
     button2.Text = "2"; 
     plhDynamicLinks.Controls.Add(button2); 
    } 
+0

那是什麼樣的代碼?在頁面被渲染和丟棄後,你想要加載啓動嗎? –

回答

0

這是強制性的註冊所有req在Page_Load/Page_Init本身中使用了動態控件的事件處理程序。一個工作的例子可以在Dynamic Control’s Event Handler’s Working

標記可以看出

<form id="form1" runat="server"> 
<div> 
    <asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" /> 
    <br /> 
    <asp:PlaceHolder ID="plhDynamicLinks" runat="server"></asp:PlaceHolder> 
</div> 
</form> 

後面的代碼

protected void Page_Load(object sender, EventArgs e) 
    { 

     if (Page.IsPostBack) 
     { 
      LinkButton lnk1 = new LinkButton(); 
      lnk1.ID = "D1"; 
      lnk1.Text = "A"; 
      //Event handler must be registered in the Page_Load/Page_Init 
      lnk1.Click += new EventHandler(LinkButton_Click); 
      plhDynamicLinks.Controls.Add(lnk1); 

      LinkButton lnk2 = new LinkButton(); 
      lnk2.ID = "D2"; 
      lnk2.Text = "B"; 
      lnk2.Click += new EventHandler(LinkButton_Click); 
      plhDynamicLinks.Controls.Add(lnk2); 

      LinkButton lnk3 = new LinkButton(); 
      lnk3.ID = "D3"; 
      lnk3.Text = "C"; 
      lnk3.Click += new EventHandler(LinkButton_Click); 
      plhDynamicLinks.Controls.Add(lnk3); 

      LinkButton lnk4 = new LinkButton(); 
      lnk4.ID = "D4"; 
      lnk4.Text = "D"; 
      lnk4.Click += new EventHandler(LinkButton_Click); 
      plhDynamicLinks.Controls.Add(lnk4); 

     } 
    } 

    protected void LinkButton_Click(object sender, EventArgs e) 
    { 
     PopulateLinksBasedOnCriteria(); 
     LinkButton clickedControl = (LinkButton)sender; 
     Response.Write(DateTime.Now.ToString()+"___"+ clickedControl.ID + " Link Button Clicked"); 
    } 

    protected void btnAdd_Click(object sender, EventArgs e) 
    { 
     PopulateLinksBasedOnCriteria(); 
    } 

    private void PopulateLinksBasedOnCriteria() 
    { 
     plhDynamicLinks.Controls.Clear(); 

     if (DateTime.Now.Second < 30) 
     { 
      LinkButton linkButton1 = new LinkButton(); 
      linkButton1.ID = "D1"; 
      linkButton1.Text = "1"; 
      plhDynamicLinks.Controls.Add(linkButton1); 

      LinkButton linkButton2 = new LinkButton(); 
      linkButton2.ID = "D2"; 
      linkButton2.Text = "2"; 
      plhDynamicLinks.Controls.Add(linkButton2); 
     } 
     else 
     { 
      LinkButton linkButton3 = new LinkButton(); 
      linkButton3.ID = "D3"; 
      linkButton3.Text = "3"; 
      plhDynamicLinks.Controls.Add(linkButton3); 

      LinkButton linkButton4 = new LinkButton(); 
      linkButton4.ID = "D4"; 
      linkButton4.Text = "4"; 
      plhDynamicLinks.Controls.Add(linkButton4); 
     } 
    } 
2
在每個回發

動態控件必須重新創建,這Article是一個很好的鏈接關於如何堅持動態控制和他們的狀態。

0

添加javascript onClick屬性到dymanic控件並設置控件事件所需的隱藏字段值。 Onclick的dymanic網格,會將postback並且會得到隱藏的字段值。在頁面加載中,如果隱藏字段具有值並在完成作業後使其成爲null,則調用執行該作業的方法。