复合控件想必大家都比较熟悉也都自己创建过,他跟用户控件有很多相似点,最大不同就是用户控件后缀为ascx,而复合控件编译后则为dll文件,还可以分发给大家使用。要想写一个复合控件就必须深刻理解他的生成过程,下面就以MSDN上的例子来说明一下.
LableTextBox
该控件具备两个公共属性(Text 和 Title)以及一个呈现引擎。这两个属性保存在视图状态中,并分别表示 TextBox 和 Label 的内容。该控件对于 Render 方法没有替换方法,并通过CreateChildControls 替换方法来生成其自己的标记。CreateChildControls 的代码首先清除子控件的集合,然后为当前控件输出的构成控件生成控件树。CreateControlHierarchy 是一种特定于控件的方法,不要求必须标记为受保护和虚拟。但请注意,大多数自带复合控件(例如 DataGrid)只是通过一个类似的虚拟方法来暴露用于生成控件树的逻辑。
控件第一次加载呈现过程,如图中所示,在页面第一次显示时,会在预呈现阶段调用CreateChildControls:

EnsureChildControls()
控件第一次加载呈现过程,如图中所示,在页面第一次显示时,会在预呈现阶段调用CreateChildControls:

特别是,请求处理代码(在 Page 类中)在将 PreRender 事件引发至页面和每个子控件之前会直接调用 EnsureChildControls。换言之,如果控件树还未完全生成,则不会呈现任何控件。
以下代码段例示了 EnsureChildControls(在 Control 基础上定义的另一种方法)的伪代码。
此方法可能会在页面和控件的生命周期内反复调用。为避免控件重复,ChildControlsCreated 属性被设为 true。如果此属性返回 true,则该方法会立即退出。
当页面回发时,ChildControlsCreated 会在周期前期调用。如图所示,它在已发布数据处理阶段调用。

注意第一次加载控件时是在预输出(PreRender)后调用CreateChildControls而回传的时候是在预加载(PreLoad)后调用CreateChildControls的。
原文地址:http://www.microsoft.com/china/msdn/library/webservices/asp.net/ASPNETContDev.mspx?mfr=true







}
}
浙公网安备 33010602011771号