添加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,然后将其添加到集合中。但是,它似乎在第一个实例中添加了一个控件,然后当我试图添加另一个控件时,在集合中覆盖此控件。为什么会这样?

添加UserControl的实例

我已经设法解决了这个问题:

将代码从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