Asp.net web form 动态生成控件的注意事项

Asp.net web form 动态生成控件的注意事项

Asp.net页面生命周期

页面初始化          Page_Init  
加载View State      LoadViewState   
回发数据处理      LoadPostData   
页面加载          Page_Load   
回发通知          RaisePostDataChangedEvent  
回发事件处理     RaisePostBackEvent  
页面预渲染       Page_PreRender   
保存             viewstate SaveViewState   
Page渲染         Page_Render   
Page 卸载       Page_UnLoad  

 

今天测试了一个bug,动态生成控件,但是状态会乱掉的一个问题.
页面如下:
一个checkboxlist,一个button.
根据你选择的checkboxlist 值,点击button会根据这个值生成相应数据的控件(

一个htmltablerow,两个htmltablecell,各加一个textbox和一个checkboxlist.

问题是如果先点了3,并且修改了生成checkboxlist的状态,
第二次再点击2,则动态生成的checkboxlist的状态会乱掉.

   

protected void Page_Load(object sender, EventArgs e){
	if (!IsPostBack){ 
	}else{
		foreach (ListItem item in CheckBoxList1.Items){
			if(item.Selected)
			AddControl(item.Value);
		}
	}
}

public void AddControl(string count){
	int cnt = 0;
	int.TryParse(count, out cnt);
	for (int i=0;i<cnt;i++){  
		HtmlTableRow tr = new HtmlTableRow();
		HtmlTableCell tc = new HtmlTableCell();
		tc.Controls.Add(new TextBox());
		HtmlTableCell tc2 = new HtmlTableCell();
		Panel pn = new Panel();
		//pn.ID = "panel" + cnt.ToString() + "_" + i.ToString();
		CheckBoxList cb = new CheckBoxList();

		//cb.ID = "checklist"+cnt.ToString()+"_"+i.ToString();
		cb.Items.Add(new ListItem("test1", "test1"));
		cb.Items.Add(new ListItem("test2", "test2"));
		cb.Items.Add(new ListItem("test3", "test3"));
		pn.Controls.Add(cb);
		tc2.Controls.Add(pn);
		tr.Cells.Add(tc);
		tr.Cells.Add(tc2);
		filter2.Rows.Add(tr);
	}
}

原因:viewstate保存控件的状态,但是它需要控件的uniqueID,我最初没有在动态生成的checkboxlist上指定一个ID,所以viewstate无法根据ID进行判断控件的状态.

解决方案:给动态 生成的控件加上ID即可.

注意事项:要在page_load里面把创建控件的方法执行.

Looking for a job working at Home about MSBI

posted @ 2019-10-04 09:53  grj001  阅读(85)  评论(0编辑  收藏  举报