1

我有一个包含多个按钮的用户控件,根据按下的按钮,页面中会添加一个不同的控件(假设按钮 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),我可以'不控制用户按下什么。

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

4

2 回答 2

2

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

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

于 2011-05-03T16:09:51.910 回答
0

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

于 2011-05-03T16:08:27.390 回答