组件开发 关于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的时候去实现。