ASP.net动态添加按钮按下的控件.回发问题

本文关键字:控件 问题 net 动态 添加 按钮 ASP | 更新日期: 2023-09-27 17:54:42

我有一个包含几个按钮的用户控件,根据按下的按钮,不同的控件被添加到页面上(假设button 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。控件数组不包含已添加的控件。我知道我需要在每次回发的Page_Load时间添加这些控件。我的问题是,因为我不知道用户添加了什么控件,我不知道我想添加什么Page_Load(可能有一个文本框,然后标签,只是一个标签或只是一个tb),我无法控制用户按下什么。

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

ASP.net动态添加按钮按下的控件.回发问题

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

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

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