【问题标题】:Usercontrol that dynamically generates a list of controls on postback在回发时动态生成控件列表的用户控件
【发布时间】:2015-02-21 11:50:36
【问题描述】:

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

它应该有一个文本框,用户可以在其中输入标签名称,以及一个提交标签的按钮。

在添加标签后,它应该动态地创建一个标签名称,带有一个“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:Placeholder 来生成动态控件。


Selector.ascx.cs

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

我正在使用存储在视图状态中的List&lt;string&gt;

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”按钮时,我会收到错误消息,因为动态生成的按钮触发的单击事件无法再找到发送者按钮,因为它尚未生成。

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 您当然可以循环按钮列表以在某些用户事件的页面上显示它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多