处理动态控件中的事件未在Page_Load上添加?

时间:2012-05-04 01:55:39

标签: asp.net postback page-lifecycle dynamic-controls

我在这里和网上看过一些文章告诉我,我不能简单地向页面添加一个新的控件,将它连接到一个处理程序,并期望它能够正常工作。

每次给出的解决方案是每次都需要将动态控件添加到Init上的页面。

我的问题是,我的控件没有添加到init上的页面,它们是在ANOTHER回发后添加的。

工作流程如下:

  1. 页面加载
  2. 用户填写文本框,点击按钮
  3. Page Posts back,在button_click事件中根据输入
  4. 创建动态链接控件
  5. 用户单击其中一个链接控件以继续执行下一步。
  6. 所以,如果这是我需要支持的行为,有没有办法做到这一点?它必须在步骤2的button_click中发生,因为动态控件基于用户在步骤2中输入的输入。

    我把自己画成了一个角落吗?我怎么能处理这样的工作流程?

1 个答案:

答案 0 :(得分:2)

动态创建链接按钮后,在页面的视图状态中设置标记。在回发时,如果在视图状态中设置了标志,则重新创建链接按钮。这是一个演示:

标记:

<asp:Button runat="server" ID="button1" OnClick="button_Click" Text="Create button A" CommandArgument="A" />
<asp:Button runat="server" ID="button2" OnClick="button_Click" Text="Create button B" CommandArgument="B" />
<asp:PlaceHolder runat="server" ID="placeHolder"></asp:PlaceHolder>

代码隐藏:

public partial class Default : System.Web.UI.Page
{
    private bool LinkButtonCreated
    {
        get { return ((bool?)this.ViewState["LinkButtonCreated"]).GetValueOrDefault(); }
        set { this.ViewState["LinkButtonCreated"] = value; }
    }

    private string LinkButtonCommandArgument
    {
        get { return (string)this.ViewState["LinkButtonCommandArgument"]; }
        set { this.ViewState["LinkButtonCommandArgument"] = value; }
    }

    protected override void LoadViewState(object savedState)
    {
        base.LoadViewState(savedState);
        if (this.LinkButtonCreated)
            this.CreateLinkButton(this.LinkButtonCommandArgument);
    }

    protected void button_Click(object sender, EventArgs e)
    {
        if (!this.LinkButtonCreated)
        {
            string commandArgument = ((Button)sender).CommandArgument;
            this.LinkButtonCreated = true;
            this.LinkButtonCommandArgument = commandArgument;
            this.CreateLinkButton(commandArgument);
        }
    }

    private void CreateLinkButton(string commandArgument)
    {
        LinkButton linkButton =
            new LinkButton
            {
                ID = "linkButton",
                Text = "Click me",
                CommandArgument = commandArgument,
            };
        linkButton.Click += this.linkButton_Click;
        this.placeHolder.Controls.Add(linkButton);
    }

    private void linkButton_Click(object sender, EventArgs e)
    {
        LinkButton linkButton = (LinkButton)sender;
        linkButton.Text = "I was clicked! Argument: " + linkButton.CommandArgument;
    }
}