2013-01-16 62 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); 
    } 
      } 
     }