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