看这篇文章之前,应该先看看 http://blog.csdn.net/hesi726/article/details/12971331
紧接昨天的页面,现在创建了动态的CheckBox,将此控件加到页面中;猜猜,这个动态创建的CheckBox是否会触发CheckedChanged 事件呢?
protected void Page_Load(object sender, EventArgs e)
{
var xx = new object[] { };
this.Repeater1.DataSource = xx;
this.Repeater1.DataBind();
var CheckBox4 = new CheckBox();
CheckBox4.ID = "DynamicCheckBox";
CheckBox4.Text = CheckBox4.ID;
CheckBox4.AutoPostBack = true;
CheckBox4.CheckedChanged += ck_CheckedChanged;
this.form1.Controls.Add(CheckBox4);
foreach (RepeaterItem aitem in Repeater1.Controls)
{
if (aitem.ItemType == ListItemType.Header)
{
CheckBox ck = (CheckBox)aitem.FindControl("HeadCheckBox");
ck.AutoPostBack = true;
ck.CheckedChanged += ck_CheckedChanged;
}
}
}
结果,是会!那么,才 Page_Load之前,在控件树中是否会根据ViewState构建这个CheckBox呢?答案是不会;
那么,为什么新创建的 CheckBox 能够根据Post回来的数据,设置选中状态,触发 CheckedChanged 事件,
而绑定在Repeater中的 CheckBox 则不能根据Post回来的数据,设置选中状态,而触发 CheckedChanged 事件 呢?
理论上连个CheckBox 初始化顺序完全是一样的;除非, Page在根据Postback里面的数据(暂且称为PostData)构建控件树时,构建成功一个,就移走一个PostData;
这样就能够解释了;
DynamicCheckBox 提交回来时,该CheckBox在form1中不存在,所以在Poge_Load之前,该Postdata会一直存在;而在创建CheckBox后,将该CheckBox添加到 form1的时候,会根据PostData设置CheckBox的状态,并相应触发 CheckedChanged 事件;
而,Repeater1中的CheckBox在提交回来时,会重新构建Repeater1中的控件数,此时 Postdata 在构建后被删除;这样,重新绑定时,新的CheckBox添加到form1中的时候,无法根据PostData设置CheckBox的状态,并触发不了 CheckedChanged 事件;
那么,是否真的这样?
只能启动调试状态在知道;可惜,调试 .netframework 实在很麻烦;网上所说 VS2008、VS2010、VS2012的调试.netframework的源代码的方法全都不能使用;最后找到 Reflector才启动了.netframework的调试;
那么,后面一篇文章,会说到根据调试信息来说明页面加载的详细过程了;(单页面,不涉及母页面);