asp.net 动态添加自定义控件

时间:2021-10-21 20:39:10

  前两天一直纠结asp.net动态添加控件后,后台获取不到控件的问题,查看了网上很多的回答,可能自己的理解有误或者自己所掌握的知识有限,都没有解决我遇到的问题,经过两天的研究,终于把问题解决了。

  我这里大概是这样的:每点击添加控件的button,就添加一个自定义控件。

    protected void btnadd_Click(object sender, EventArgs e)
{
this.CreateControl();
}
    
private void CreateControl()
{
UserControl.control usercontrol
= (UserControl.control)Page.LoadControl("UserControl/control.ascx");

        int count = this.PlaceHolder1.Controls.Count;
        usercontrol.ID
= "VoiceReportControl" + (count + 1);
        usercontrol.Id
= (count + 2).ToString();

        this.PlaceHolder1.Controls.Add(usercontrol); //注意一定要将控件添加在placeHolder控件中,不然会出现不显示的问题
  
        this.HiddenField1.Value = this.PlaceHolder1.Controls.Count.ToString(); //用隐藏域来存储当前已经添加的自定义控件的个数
     }

然后在Page_Load中

       if (ViewState["firstLoad"] != null)//
{
CreatControl1();
//若不是首次加载,则添加控件
}
       ViewState["firstLoad"] = false;//ViewState中可以随意存值,它是用于页面内传值的
View Code
/// <summary>
/// 加载控件
/// </summary>
private void CreatControl1()
{
int count = 0;
if (int.TryParse(this.HiddenField1.Value, out count))
{
count
= Convert.ToInt32(this.HiddenField1.Value);
for (int i = 0; i < count; i++)
{
UserControl.control usercontrol
= (UserControl.control)Page.LoadControl("UserControl/VoiceReportControl.ascx");
            usercontrol.ID
= "VoiceReportControl" + (i + 1);
            usercontrol.Id
= (i + 2).ToString();

            this.PlaceHolder1.Controls.Add(usercontrol);
          }
       }
     } 

 

 

网上好多都说些在OnInit中,但是如果写在这里面,执行的时候控件的viewState并没有被赋值,所以是获取不到隐藏域的值的,所以我选择现在page_Load里。先写到这里吧,欢迎大家一起讨论