用于解决设计时问题的 CompositeControl
随 ASP.NET 2.0 一同提供了一个名为 CompositeControl 的基类。因此,新的非数据绑定复合控件应该从该类派生而不是从 WebControl 派生。在开发控件方面,CompositeControl 的用法变动不大。您仍然需要替换 CreateChildControls 并按先前所述方式编码。那么 CompositeControl 的作用是什么?让我们先从其原型着手:
- public class CompositeControl :WebControl,
- INamingContainer,
- ICompositeControlDesignerAccessor
使用该类就无需再用 INamingContainer 装饰控件,但这实际上并不是很重要,因为接口只是一个标记并且不包含任何方法。更为重要的是,该类实现了一个名为 ICompositeControlDesignerAccessor 的全新接口。
- public interface ICompositeControlDesignerAccessor
- {
- void RecreateChildControls();
- }
此接口由复合控件的标准设计器用于在设计时重建控件树。以下是 CompositeControl 中方法的默认实现过程。
- void ICompositeControlDesignerAccessor.RecreateChildControls()
- {
- base.ChildControlsCreated = false;
- EnsureChildControls();
- }
简言之,如果您从 CompositeControl 派生复合控件,就不会遇到设计时的故障,而且无需采用技巧和妙计就可以使控件在运行时和设计时都能正常运行。
要充分理解此接口的重要性,可试以寄存某 LabelTextBox 复合控件的示例页为例,并将其转换为设计模式。控件在运行时工作正常,但在设计时却不可见。
图 5:只有复合控件从 CompositeControl 派生才对它们进行特殊的设计时处理
如果只是用 CompositeControl 替换 WebControl,则控件在运行时仍然保持正常工作,而在设计时也会运行良好。
图 6:在设计时运行良好的复合控件
【编辑推荐】