Usercontrol,用于在回发时动态生成控件列表

时间:2014-12-23 10:36:59

标签: c# asp.net user-controls viewstate asp.net-placeholder

我想创建一个可重用的用户控件,允许用户创建和删除标签。

它应该有一个文本框,用户可以输入标签名称,还有一个按钮来提交标签。

在对标签进行总结之后,它应该动态创建一个标签名称带有“X”按钮的标签,以便为每个输入的标签删除它。

这样的事情:

[ Textbox ] [Submit]

[X] Tag 1
[X] Tag 2
[X] Tag 3

问题在于我无法弄清楚如何使一切正常运作。


Selector.ascx

< markup for the textbox >
< markup for the sumbit button >
<asp:Placeholder runat="server" ID="PHList" />

我正在使用asp:占位符来生成动态控件。


Selector.ascx.cs

我需要跟踪回发之间生成的控件。

我正在使用存储在viewstate中的List<string>

private List<string> SelectedTags
{
    get
    {
        return (List<string>) ViewState["SelectedTags"];
    }
    set { ViewState["SelectedTags"] = value; }
}

当我单击提交按钮时,我将新标签添加到SelectedTags列表,并调用RefreshPlaceholder函数:

void RefreshPlaceholder()
{
    PHList.Controls.Clear();
    foreach(var x in SelectedTags) 
    {
         // generate a label and the "X" button, wiring it with a lambda
    }
}

单击提交按钮时,会在回发后正确生成并显示新的(按钮,标签)对。

但是,当我单击任何生成的“X”按钮时,我收到错误,因为动态生成的按钮触发的click事件不再能找到发送者按钮,因为它尚未生成。

如果我尝试在OnLoad中生成按钮,则会出现同样的问题,因为回发事件发生在Page.Load之前。

如果我尝试在OnInit中生成按钮,ViewState尚未更新,因此生成的列表将过时,因为SelectedTags视图状态列表尚未更新。

我似乎无法找到使一切按预期工作的解决方案。我做错了什么?

1 个答案:

答案 0 :(得分:1)

在OnInit方法上声明类型按钮的列表;然后在RefreshPlaceHolder中检索并循环选定的标签并将它们添加到List

protected override void OnInit(EventArgs e)
        {

               List<Button> listButtons ;

            base.OnInit(e);
        }  



 void RefreshPlaceholder()
    {
        listButtons = new List<Button>();
        PHList.Controls.Clear();
        foreach(var x in SelectedTags) 
        {
         Button b = new Button();
         b.Text=x;
         listButtons.add(b);



       // generate a label and the "X" button, wiring it with a lambda
        }
    }