【问题标题】:Dynamic Control’s Event Handler’s Working动态控制的事件处理程序的工作
【发布时间】:2013-01-16 17:36:23
【问题描述】:

我有以下代码在普通按钮的单击事件上添加动态 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 参考可以证实这种行为? (即,事件处理程序将基于在 Page_Load/Page_Init 时注册的 ID。即使清除并再次添加控件,这也将起作用)
  2. 在创建 LinkBut​​tons 时存在重复代码 - 一个在 Page_Load 内部,另一个在 PopulateLinksBasedOnCriteria() 方法内部。有没有更好的方法来完成这项业务任务而无需重复代码?

标记

<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);
        }
    }

【问题讨论】:

    标签: c# asp.net .net


    【解决方案1】:

    我建议在 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);
        }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多