添加UserControl的实例

时间:2011-11-11 17:40:22

标签: c# asp.net user-controls

我有一个包含面板和按钮的网页。单击该按钮时,我想将一个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,然后将其添加到集合中。但是它似乎在第一个实例中添加了一个控件,然后在我尝试添加另一个控件时覆盖该集合中的控件。这是为什么?

2 个答案:

答案 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