【问题标题】:ASP.net Dynamically adding controls on Button press. Postback issueASP.net 在按钮按下时动态添加控件。回发问题
【发布时间】:2011-08-17 20:00:30
【问题描述】:

我有一个包含多个按钮的用户控件,根据按下的按钮,页面中会添加不同的控件(假设按钮 1 添加了一个文本框,按钮 2 添加了一个标签)。

我的代码如下:

protected void but1_click(object sender, EventArgs e)  
{  
    TextBox tb = new TextBox();  
    tb.ID = "tb1";  
    paramsCtrlDiv.Controls.Add(tb);  
}  

protected void but2_click(object sender, EventArgs e)  
{  
    Label lb = new Label();  
    lb.ID = "lb1";  
    paramsCtrlDiv.Controls.Add(lb);  
}  

然后我有第三个按钮 (button3) 来获取页面上的所有控件及其值。 (假设本例中每个按钮只被点击一次)。

我的问题是按下 button3 时,paramsCtrlDiv.controls 数组不包含已添加的控件。我知道我需要在每次回发的 Page_Load 时间添加这些控件。我的问题是因为我不确切知道用​​户添加了哪些控件我不知道我想添加什么 Page_Load(可能有一个文本框,然后是标签,只是一个标签或只是一个 tb),我可以'不控制用户按下的内容。

我知道我可以在会话中存储所有内容,但我不确定这是一个优雅的解决方案。在不同的选项卡上也可以有多个此控件的实例,因此每个实例都必须正确维护自己的控件集合

【问题讨论】:

    标签: c# asp.net webforms postback dynamic-controls


    【解决方案1】:

    因为您是动态地执行此操作,所以您需要一种存储您正在执行的操作的方法,以便服务器可以使用每个 PostBack 重新创建它。如果您不想使用Session,请将数据存储在ViewState 中(无论时间如何,它将与页面保持一致)。创建一个List<YourControlObjects> 并确保它是Serializable,然后将其存储在ViewState 中。您可能希望存储控件类型、位置等,以便每次有PostBack 时都可以在Page_Load 上重建它。

    问题归结为您需要为这些动态创建的控件维护自己的状态。这只是一个建议,但您可以通过多种不同的方式来实现。

    【讨论】:

      【解决方案2】:

      我个人会使用ListView 来处理这个问题。在ItemTemplateVisible=false 中包含您需要的所有控件,并将它们绑定到存储在视图状态中的小列表。以编程方式设置在行数据绑定上可见的正确控件。 请注意,在重新绑定之前,您必须在控件中收集数据并将其保存在列表中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-28
        相关资源
        最近更新 更多