ASP.net在按钮上动态添加控件。回发问题

时间:2011-05-03 15:31:46

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

我有一个用户控件,其中包含几个按钮,根据按下的按钮,将不同的控件添加到页面中(假设按钮1添加了一个TextBox,button2添加了一个标签)。

我的代码如下:

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),我可以控制用户按下的内容。

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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