动态控件的状态问题的分析 概括
引用出处:http://blog.joycode.com/felix/archive/2004/10/21/36136.aspx
以下代码片断:
private void Page_Load(object sender, EventArgs e)
{
DropDownList ddlDynamic = new DropDownList();
ddlDynamic.ID = "ddlDynamic";
HtmlForm form1 = (HtmlForm)this.FindControl("Form1");
if (!IsPostBack)
{
ddlDynamic.Items.Add("Before");
}
form1.Controls.Add(ddlDynamic);
if (!IsPostBack)
{
ddlDynamic.Items.Add("After");
}
}
{
DropDownList ddlDynamic = new DropDownList();
ddlDynamic.ID = "ddlDynamic";
HtmlForm form1 = (HtmlForm)this.FindControl("Form1");
if (!IsPostBack)
{
ddlDynamic.Items.Add("Before");
}
form1.Controls.Add(ddlDynamic);
if (!IsPostBack)
{
ddlDynamic.Items.Add("After");
}
}
其中的 "Before" 的状态不会保存到 ViewState里面,因为在
SaveViewState() 方法里面会检查这个DropDownList的一个标志位,如果标志位置位,则 IsTrackingViewState 返回 true。
置位的办法是通过 TrackViewState方法,
而 TrackViewState方法是 ControlCollection.Add 方法即“form1.Controls.Add”引发的.所以如果把form1.Controls.Add 这句话放到最前面就对了。