目前,正在做一个asp.net 2.0项目,其中使用了复合控件。
在一个页面上放置了GridView控件用于显示多条数据的摘要信息,同时,放置了若干小控件(包括复合控件)来显示详细资料,GridView控件中有Command字段“详细”来处理。(也可以分为两个页面布局,图省事,放在一起了,:>)。在使用过程中发现一个奇怪的现象:第一次点“详细”时,一切正常显示;后面的数据涉及到复合控件的信息就不能正常显示了。经调试发现,原因是程序执行路径不完全一样,最主要的是复合控件的CreateChildControl。 很明显是同一个页面上控件创建一次就OK了,但后果是第一次查看的数据可以正常绑定复合控件,后面的就不行了(见代码1)。虽然每次给控件赋值(代码3)都会调用代码2的Set操作,但不会调用代码1的最后一句。这就导致了最初的怪现象。 //代码1 protected override void CreateChildControls() { //base.CreateChildControls(); #region 控件初始化
_tbxFinalPersonList = new TextBox(); _tbxFinalPersonList.ID = "tbxFinalPersonList"; _tbxFinalPersonList.ReadOnly = true; _tbxFinalPersonList.Width = TextWidth; _tbxFinalPersonList.Height = TextHeight; _tbxFinalPersonList.TextMode = TextMode; _tbxFinalPersonList.Text = ViewState["PersonNameList"] == null ? string.Empty : ViewState["PersonNameList"].ToString();
...创建其他控件 }
//代码2 复合控件属性:
public string PersonNameList { get { return _tbxFinalPersonList.Text; } set { ViewState["PersonNameList"] = value; CreateChildControls();//710 //_tbxFinalPersonList.Text = value; }//2008.5.16孙宜贵,2008-5-19孙宜贵 7-9孙宜贵 }
//代码3 this.PersonList1.PersonNameList = papaerModule.AuthorName;//得到获奖人员列表
所以,只好在每次绑定时,重新调用代码1,但是重复创建仍然会产生错误,后来把代码1改造后(代码4)就通过了。 //代码4 protected override void CreateChildControls() { //base.CreateChildControls(); #region 控件初始化 if (_tbxFinalPersonList == null) { _tbxFinalPersonList = new TextBox(); _tbxFinalPersonList.ID = "tbxFinalPersonList"; _tbxFinalPersonList.ReadOnly = true; _tbxFinalPersonList.Width = TextWidth; _tbxFinalPersonList.Height = TextHeight; _tbxFinalPersonList.TextMode = TextMode;
...创建其他控件 } _tbxFinalPersonList.Text = ViewState["PersonNameList"] == null ? string.Empty : ViewState["PersonNameList"].ToString(); }