我有一个包含面板和按钮的网页。单击该按钮时,我想将一个UserControl的新实例添加到面板中。
panel.Controls.Add方法指定它将一个项添加到集合中。
我可以使用局部变量来存储控件的实例数。然后,当它添加它时,它会多次循环,从而创建新的控件。
private void AddUCToUI(int counter)
{
for (int i = 0; i < counter; i++)
{
MyControl ctrlMyControl = (MyControl)LoadControl("MyControl.ascx");
ctrlMyControl.SetID(i);
myPanel.Controls.Add(ctrlMyControl);
}
}
但是,我不想每次都重新创建所有控件,因为用户可能已经在其中输入了数据......
所以我想做的就是创建另一个控件,并将其添加到已包含第一个控件的集合中。
private void AddUCToUI(int counter)
{
MyControl ctrlMyControl = (MyControl)LoadControl("MyControl.ascx");
ctrlMyControl.SetID(counter);
myPanel.Controls.Add(ctrlMyControl);
}
这应创建一个新控件,给它一个ID,然后将其添加到集合中。但是它似乎在第一个实例中添加了一个控件,然后在我尝试添加另一个控件时覆盖该集合中的控件。这是为什么?
答案 0 :(得分:1)
我设法解决了这个问题:
将代码从onInit
移至Page_Load
并使用counter
的会话变量解决了增加其值的问题。发生PostBack时不会重置会话变量。
这是我的解决方案:
protected override void Page_Load(object sender, EventArgs e)
{
int counter;
if (Session["counter"] == null)
{
counter = 0;
}
else
{
counter = (int)Session["counter"];
}
for (int i = 0; i < counter; i++)
{
MyControl ctrlMyControl = (MyControl)LoadControl("MyControl.ascx");
ctrlMyControl.ID = String.Format("ctrl_{0}", myPanel.Controls.Count); //count = 0
myPanel.Controls.Add(ctrlMyControl); //count = 1
}
}
答案 1 :(得分:0)
因为您要动态添加控件,所以每次都必须重新创建它们。但是,如果在重新创建控件时为控件分配相同的ID,则会从ViewState重新填充它们。如果没有重新填充控件,您可能在页面生命周期中过晚地重新创建它们。尝试在OnInit
期间重新创建它们:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
for (int i = 0; i < counter; i++)
{
MyControl ctrlMyControl = (MyControl)LoadControl("MyControl.ascx");
ctrlMyControl.ID = String.Format("ctrl_{0}", myPanel.Controls.Count); //count = 0
myPanel.Controls.Add(ctrlMyControl); //count = 1
}
}
另一个选项是DynamicControlsPlaceHolder
。从本质上讲,此控件可以为您完成上述操作,而无需任何其他代码。
你可以在这里下载:
http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx