2013-01-16 58 views
1

我有以下代碼,在正常按鈕的單擊事件上添加動態LinkBut​​ton。 LinkBut​​tons需要一個EventHandler 「LinkButton_Click「。由於事件處理程序需要註冊,而Page_Load/Page_Init本身,我首先在Page_Load(在回發方案)中添加所有可能的鏈接。 (總共有四個鏈接按鈕;根據業務場景,只有兩個將顯示在屏幕上)動態控件的事件處理程序的工作

代碼工作正常,事件處理程序在單擊事件中得到調用。

注意:業務場景是 - 如果當前時間的第二部分小於30,則需要顯示前兩個LinkBut​​ton;如果大於30,則需要顯示最後兩個LinkBut​​ton。

注:控件被清除,內PopulateLinksBasedOnCriteria()方法再次添加

質詢

  1. PopulateLinksBasedOnCriteria()方法,我在新創建的鏈接按鈕實例。事件處理程序仍在開火。這是因爲在Page_Load中添加的ID相同。有沒有任何MSDN參考證實這種行爲? (即事件處理程序將基於註冊的ID,而Page_Load/Page_Init。即使控件被清除並再次添加,這將起作用)
  2. 創建LinkBut​​tons時出現重複代碼 - Page_LoadPopulateLinksBasedOnCriteria()內部有一個內部代碼。有沒有更好的方式來實現這個業務任務沒有重複的代碼?

標記

<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

我會建議檢測是什麼原因導致的回傳在Page_Load事件On postback, how can I check which control cause postback in Page_Init event然後

if (Page.IsPostBack && *PostBackControl.Name=="btnAdd"*) 
      { 
if (DateTime.Now.Second < 30) 
     { 
       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); 
    } else 
     { 
       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); 
    } 
      } 
     }