是否可以将EventHandler添加到在Page_Load之后在运行时添加的控件?

时间:2012-07-10 02:10:08

标签: c# asp.net

基于以下代码,它似乎不起作用。我可以在Page_Load之后动态地向页面添加一个控件,但我无法将EventHandler连接到它。

这是我的代码隐藏:

public partial class AddingControlsToPanelAtRuntime : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DrawPage();
    }

    private void DrawPage()
    {
        Label label;

        label = new Label();
        label.ID = "Label1";
        label.Text = "Label 1";
        Panel1.Controls.Add(label);
        Panel1.Controls.Add(new LiteralControl("<br />"));

        label = new Label();
        label.ID = "Label2";
        label.Text = "Label 2";
        Panel1.Controls.Add(label);
        Panel1.Controls.Add(new LiteralControl("<br />"));

        LinkButton linkButton1 = new LinkButton();
        linkButton1.ID = "linkButton1";
        linkButton1.Text = "linkButton 1";
        linkButton1.Click += new EventHandler(LinkButton_Click);
        Panel1.Controls.Add(linkButton1);
        Panel1.Controls.Add(new LiteralControl("<br />"));

        LinkButton linkButton2 = new LinkButton();
        linkButton2.ID = "linkButton2";
        linkButton2.Text = "linkButton 2";
        linkButton2.Click += new EventHandler(LinkButton_Click);
        Panel1.Controls.Add(linkButton2);

    }

    protected void LinkButton_Click(object sender, EventArgs e)
    {
        Panel1.Controls.Add(new LiteralControl("<p>"));
        LinkButton linkButton4 = new LinkButton();
        linkButton4.ID = "linkButton4";
        linkButton4.Text = "linkButton 4";
        linkButton4.Click += new EventHandler(LinkButton_Click);
        Panel1.Controls.Add(linkButton4);
    }

}

因此,在从Page_Load调用的DrawPage()中,所有控件都很好地添加到Panel中,并且EventHandler完美地连接起来。

当我点击LinkBut​​ton1或LinkBut​​ton2时,它们正确地调用了LinkBut​​ton_Click()。在LinkBut​​ton_Click()中,我在运行时添加另一个控件并连接和EventHandler,但是当我点击该链接按钮时,它只回发到Page_Load并且不调用LinkBut​​ton_Click()。

那么,我在这里尝试做的是基于ASP.NET管道而不可能吗?

1 个答案:

答案 0 :(得分:0)

你想做的事情是可能的。真正意识到页面生命周期将有所帮助。 http://msdn.microsoft.com/en-us/library/ms178472.aspx

以下是您网页上发生的最新消息。

Page_Load
     Create Controls (label 1/2, linkbutton 1/2)

-> Browser renders label 1/2, linkbutton 1/2
-> User Clicks link button 1 or 2

Page_Load
     Create Controls (label 1/2, linkbutton 1/2)
Control events fire
     LinkButton_Click fires
          Adds another linkbutton (linkbutton 4)

-> Browser renders label 1/2, linkbutton 1/2 AND 4
-> User Clicks link button 4

Page_Load
     Create Controls (label 1/2, linkbutton 1/2)
Control events fire
     (There is no link button 4 so nothing happens)

-> Browser renders label 1/2, linkbutton 1/2 (4 is missing)

您缺少的核心部分是重新添加动态创建的控件。每个控件都需要在每个帖子后面读取(如果你关心viewstate,则按照相同的顺序)。您可以通过视图状态或任何其他回发持久性机制跟踪需要读取的内容。