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),我无法控制用户按下什么。
我知道我可以在会话中存储所有内容,但我不确定这是一个优雅的解决方案。这个控件也可以在不同的选项卡上有多个实例,所以每个实例都必须正确维护它自己的控件集合
因为您是动态地执行此操作的,所以您需要一种存储您正在执行的操作的方法,以便服务器可以使用每个PostBack
重新创建它。如果不想使用Session
,则将数据存储在ViewState
中(无论时间如何,它都会与页面保持一致)。创建一个List<YourControlObjects>
,并确保它是Serializable
,然后将其存储在ViewState
中。您可能想要存储控件类型,位置等,以便每次有PostBack
时都可以在Page_Load
上重新构建它。
问题归结为您需要为这些动态创建的控件维护自己的状态。这只是一个建议,但你可以做很多不同的方法。
我个人会使用ListView
来处理这个问题。包括ItemTemplate
和Visible=false
中所需的所有控件,并将它们绑定到存储在viewstate中的小列表。以编程方式设置行数据绑定上可见的正确控件。注意,在重新绑定控件之前,您必须收集控件中的数据并将其保存在列表中。