添加UserControl的实例
本文关键字:实例 UserControl 添加 | 更新日期: 2023-09-27 18:14:07
我有一个包含面板和按钮的网页。当你点击按钮时,我想在面板上添加一个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,然后将其添加到集合中。但是,它似乎在第一个实例中添加了一个控件,然后当我试图添加另一个控件时,在集合中覆盖此控件。为什么会这样?
我已经设法解决了这个问题:
将代码从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
}
}
因为是动态添加控件,所以每次都必须重新创建它们。但是,如果您在重新创建控件时为它们分配相同的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