2011-05-03 106 views
1

我有一个用户控件,其中包含几个按钮,取决于按下按钮不同的控件被添加到页面(可以说,按钮1添加一个文本框,按钮2添加一个标签)。ASP.net在Button按钮上动态添加控件。回复问题

我的线沿线的代码:

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

我再有第三个按钮(按钮3)获得页面和他们的价值观上的所有控件。 (假设这个例子中每个按钮只被点击一次)。

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

我知道我可以在会话中存储所有内容,但我不确定这是否是一个优雅的解决方案。此外,还可以在不同的标签此控件的多个实例使每一个有正确地维护它自己的控件集合

回答

0

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

2

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

问题归结为您需要为这些动态创建的控件维护自己的状态。这只是一个建议,但你可以用很多不同的方式来完成。