日期:2014-05-19  浏览次数:20457 次

组件开发 关于CreateChildControl顺序的问题
如果在组件里面重载CreateChildControl方法,而方法里面需要调用一个属性
比如
  protected   override   void   CreateChildControls()
                {
                        if   (!string.IsNullOrEmpty(this.TableName))
                        {
                                .....
                        }
这里面的TableName是动态的,在页面上这个参数如果是通过一个方法里面来传递的比如
private   void   Bind(object   sender,   EventArgs   arg)
{
      this.Control1.TableName=   "ABC ";
}
但是这样的话控件获取的就是空的,因为构造的顺序是
组件的Init事件--> 页面的init事件--> 组件的CreateChildControl事件.....
是否只能吧参数的传递放在init事件里面执行,如果不是,还有其他的解决方法没?

------解决方案--------------------
组件的Init事件--> 页面的init事件--> (传递参数)-> 组件的CreateChildControl事件.....
CreateChildControl如果是Init后根据某些数据生成控件,就不应该Init后调用,而应该传入参数之后再调用。
private void Bind(object sender, EventArgs arg)
{
this.Control1.TableName= "ABC ";
this.Control1.CreateChildControl();
}

------解决方案--------------------
改变TableName后,在控件中调用CreateChildControl方法. 或者: public TableName { set { //......... 调用方法. } } 没有试过.仅为参考
------解决方案--------------------
“组件的Init事件--> 页面的init事件--> 组件的CreateChildControl事件.....”

这是很正常的。控件的CreateChildControls第一次被调用是因为在页面的LoadView时,需要查找相应的控件的ID,于是递归地调用了所有控件的EnsureChildControls()方法。因此,第一次调用CreateChildControls时,是页面企图“重建”控件并且然后装入控件的状态的时期。对于你的程序,此时应该从ViewState[ "tblname "]中恢复出原来的子控件树一边页面装入子控件的各个状态、页面提交的值、准备触发的事件。如果此时不是恢复旧的控件树,那么页面就无法找到原来的控件,或者找到相同ID但是类型错误的控件从而引发“控件树结构异常、无法恢复ViewState”那类非常严重的错误。在页面page_load结束之后,已经将子控件重建好了结构、处理了页面提交之和事件之后,才应该改变结构响应新的TableName所带来的改变,不应该把这个改变硬要在第一次调用CreateChildControls的时候去实现。