作者在 2007-10-19 18:12:00 发布以下内容
创建复合服务器控件
诸如 Login 和 GridView 这些可靠的控件是由很多基本控件组成的。在 ASP.NET 1.x 中,您必须通过艰苦的工作将嵌套标记和元素添加到自定义控件中来开发复合控件。在 ASP.NET 2.0 中,您可以通过扩展 System.Web.UI.WebControls.CompositeControl 类来构建复杂的复合控件。CompositeControl 类提供了将多个控件的输出合并到单个统一的控件中所必需的框架。
管理复合控件比管理基本自定义控件稍微困难一些,因为复合控件需要一些自定义布局的信息。复合控件将它们的呈现和事件处理任务委托给构成控件。子组件的所有关联的适配器类也会被自动应用。这样,如果您具有适当的适配器,复合控件将会在任何目标浏览器类型或设备上正确地呈现。
创建复合控件
创建复合控件的初始过程与创建自定义服务器控件的初始过程相似。但是,该过程还涉及了更多的步骤。在以下示例中,我们将创建一个由 Label 和 TextBox 组成的简单的复合 AgeCollector 控件,它旨在收集生日的信息。
复合控件类应该通过从 CompositeControl 继承开始。
诸如 Login 和 GridView 这些可靠的控件是由很多基本控件组成的。在 ASP.NET 1.x 中,您必须通过艰苦的工作将嵌套标记和元素添加到自定义控件中来开发复合控件。在 ASP.NET 2.0 中,您可以通过扩展 System.Web.UI.WebControls.CompositeControl 类来构建复杂的复合控件。CompositeControl 类提供了将多个控件的输出合并到单个统一的控件中所必需的框架。
管理复合控件比管理基本自定义控件稍微困难一些,因为复合控件需要一些自定义布局的信息。复合控件将它们的呈现和事件处理任务委托给构成控件。子组件的所有关联的适配器类也会被自动应用。这样,如果您具有适当的适配器,复合控件将会在任何目标浏览器类型或设备上正确地呈现。
创建复合控件
创建复合控件的初始过程与创建自定义服务器控件的初始过程相似。但是,该过程还涉及了更多的步骤。在以下示例中,我们将创建一个由 Label 和 TextBox 组成的简单的复合 AgeCollector 控件,它旨在收集生日的信息。
复合控件类应该通过从 CompositeControl 继承开始。
public class AgeCollector : CompositeControl{} |
定义属性
对于我们的简单控件,我们必须为标签 (Prompt) 和文本框 (DateOfBirth) 创建属性。
[Bindable(true), Category("Appearance"), DefaultValue("Please enter your date of birth:"), Description("Text to prompt user with.") Localizable(true)] public virtual String Prompt { get { string s = (string)ViewState["Prompt"]; return (s == null) ? String.Empty : s; } set { ViewState["Prompt"] = value; } } |
再一次,我们使用特性为属性提供说明和默认值。我们选择了使提示可以进行本地化,以便该控件无论何时都可以用于要求进行国际化的应用程序中。实际的提示可以绑定到包含语言特定文本的资源文件。
还必须定义 DateOfBirth 属性。但是,我们不是使用 String,而是使用 DateTime 数据类型来正确地存储日期。
[Bindable(true), Category("Appearance"), DefaultValue(""), Description("Date of Birth Input area")] public virtual DateTime DateOfBirth { get { bject o = ViewState["DateOfBirth"]; return (o == null) ? DateTime.Now : (DateTime)o; } set { ViewState["DateOfBirth"] = value; } } |
CreateChildControls 方法
我们的复合控件由一个标签和一个文本框组成。我们无法使用简单控件的技术来显示这两个标记,除非使用强制方式和 Render() 方法。因为我们希望利用自适应呈现并显示我们的两个控件,所以我们需要覆盖内置到 CompositeControl 类中的 CreateChildControls() 方法。这种方法使我们可以定义控件,并将我们的复合控件的属性传递到要显示的单个控件中。
protected override void CreateChildControls() { //Create and load the label Label lab1 = new Label(); lab1.Text = Prompt; lab1.ForeColor = this.ForeColor; this.Controls.Add(lab1); //Add a line break between the label and text box Literal lit = new Literal(); lit.Text = ""; this.Controls.Add(lit); //Add the Textbox TextBox tb = new TextBox(); tb.ID = "tb1"; tb.Text = DateOfBirth.ToString(); this.Controls.Add(tb); //call the parent method base.CreateChildControls(); } |
请注意,我们必须初始化每个控件、分配所有属性,然后将控件添加到内置到 CompositeControl 类中的 Controls 集合。我们还使用了 Literal 对象将换行符置于标签和控件之间。Literal 对象是非常简单的控件,您可以使用它在功能元素之间插入原始 HTML。
请注意,我们还对基本方法进行了调用,以便确保我们的复合控件具有内置到 CompositeControl 基类中的任何其他功能。尤其是,基本方法会强制 ASP.NET 将 Controls 集合的所有元素添加到控件树中。