 图1 类结构图 |
如图1并结合代码可知,Register类继承自CompositeControl基类,其实现了7个属性和3个方法。属性包括ButtonText、Email、EmailErrorMessage、EmailLabelText、Name、NameErrorMessage和NameLabelText。这些属性通过命名,相信读者基本可以了解其意义。
另外,Register类中重写了来自不同对象的3个方法。
(1)Render方法隶属于Control基类,在本例中主要在该方法中定义了一些与控件布局相关的HTML等内容。
(2)CreateChildControls方法隶属于Control基类。在本示例中通过重写该方法,实现了将子控件添加到复合控件树中的任务。请读者牢记:每当需要Controls集合时,例如,在数据绑定期间(如果适用),服务器控件结构都会依赖对CreateChildControls的调用。为此,必须在CreateChildControls方法中添加子控件。
(3)RecreateChildControls方法来自CompositeControl基类的ICompositeControlDesignerAccessor接口。通过实现这个方法可使复合控件的设计器可以在设计时重新创建该控件的子控件。
下面列举了为测试Register控件而创建的Default.aspx页面源代码。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Register TagPrefix="Sample" Assembly="WebControlLibrary" Namespace="WebControlLibrary" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>实现复合控件呈现</title> </head> <body> <form id="form1" runat="server"> <div> <Sample:Register id="demo1" runat="server" ButtonText="注册" EmailLabelText="电子邮件" NameLabelText="用户名" EmailErrorMessage="不能为空" NameErrorMessage="不能为空" /> </div> </form> </body> </html> |
示例效果如图2所示。

图2 应用程序效果图
如图2所示,复合控件Register在页面中显示了文本、文本框、按钮等,同时,还提供了输入验证功能。然而,当用户单击“注册”按钮之后,即使在用户名和电子邮件的输入都通过验证的情况下,页面仍然没有引发相应的事件处理程序。这是由于在本例中没有实现按钮的事件处理内容。有关复合控件的事件实现将在随后的文章中进行详细讲解。
小结
复合控件是通过将其他控件聚合在某一公用API下创建而成的控件。复合控件将保留自己子控件的活动实例,并且不仅限于呈现这些实例。使用复合控件可以带来几点好处,例如可以简化对事件和回发的处理。然而,本文并没有对复合控件的事件实现等相关内容进行讲解,请读者继续关注本系列的随后文章。