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

  前两天一直纠结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里。先写到这里吧,欢迎大家一起讨论

原文地址:https://www.cnblogs.com/wyynts/p/3374640.html