如果在组件里面重载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事件里面执行,如果不是,还有其他的解决方法没?

解决方案 »

  1.   

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

      

  2.   

    可以考虑在prerender中改写子控件属性.
      

  3.   

    可以考虑在prerender中改写子控件属性.---------------------------------------------
    因为控件里面的control是按数据库的条件字段生成的,如果不在createChildControl里做,控件事件就无法绑定的.但现在就是说子控件的生成是依赖于控件的属性字段的...
      

  4.   

    改变TableName后,在控件中调用CreateChildControl方法.或者:public TableName{
     set
    {
        //.........      调用方法.
    }
    }没有试过.仅为参考
      

  5.   

    public string TableName
    {
      get{ return (string)ViewState["tblname"]; }
      set{ ViewState["tblname"]=value; ChildControlsCreated=false; }
    }所有的控件在PreRender的时候都会自动调用EnsureChildControl方法,而这个方法会检查ChildControlsCreated,如果为false则自动调用CreateChildControls()方法并且再将标志改为true。这是控件早已经设计好的框架。
      

  6.   

    如果你重写了OnPreRender方法,一定不要忘记调用父类的OnPreRender:protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        ...........
    }
      

  7.   

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