一个看上去简单的问题(1):Asp.Net动态设定事件 - 1

看这篇文章之前,应该先看看 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的调试;

  那么,后面一篇文章,会说到根据调试信息来说明页面加载的详细过程了;(单页面,不涉及母页面);

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值