65.9K
CodeProject 正在变化。 阅读更多。
Home

自定义控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (5投票s)

2012 年 1 月 31 日

CPOL

4分钟阅读

viewsIcon

16933

如何添加自定义控件。

自定义控件构建概述

当我们创建一个组合控件时,我们从现有控件构建一个新的控件。例如,我们可以从现有的TextBoxRequiredFieldValidator控件创建一个组合的AddressForm控件。当我们创建组合控件时,我们将现有控件捆绑在一起作为新控件。

我们必须解决的第二个问题是选择新控件的基控件。我们可以从任何现有的 ASP.NET 控件继承一个新的控件。例如,如果我们想创建一个更好的GridView控件,那么我们可以从GridView控件继承一个新的控件,并向我们的自定义GridView控件添加额外的属性和方法。

通常,在构建基本控件时,我们会从以下基类之一继承我们的新控件

  • System.Web.UI.Control
  • System.Web.UI.WebControls.WebControl
  • System.Web.UI.WebControls.CompositeControl

CompositeControl类继承自WebControl类,而WebControl类又继承自Control类。这些基类的每一个都添加了额外的功能。

ASP.NET 框架中所有控件的基类是System.Web.UI.Control类。每个控件,包括TextBoxGridView控件,最终都派生自这个控件。这意味着System.Web.UI.Control类的所有属性、方法和事件都由框架中的所有控件共享。

所有 Web 控件都继承自基类System.Web.UI.WebControls.WebControlControl类和WebControl类之间的区别在于,派生自WebControl类的控件始终具有开始和结束标签。由于WebControl有开始和结束标签,我们也获得了更多的格式化选项。例如,WebControl类包括BackColorFontForeColor属性。

例如,ASP.NET Literal 控件继承自基类Control,而Label控件继承自基类WebControlRepeater控件继承自基类Control,而GridView控件(最终)继承自WebControl类。

最后,System.Web.UI.WebControls.CompositeControl是 ASP.NET 2.0 框架中的新特性。我们应该使用这个类作为任何组合控件的基类。CompositeControl自动为其子控件创建一个命名容器。它还包括一个重写的Controls属性,该属性强制子控件在设计视图中显示。

创建自定义控件的逐步过程

  • 创建新项目,选择类库模板并将其命名为RequiredTextBox

  • 将类库的类重命名为 *RequiredTextBox.cs*。
  • sys.web引用添加到您的项目,如上所述,它是所有 Web 控件的基类。
  • 选择您的项目,右键单击并选择添加引用,如下所示

单击添加引用,然后您将获得一个弹出窗口,从中选择sys.web组件,从 .NET 选项卡,如下所示

构建组合控件

我们可以构建一个组合控件。当我们创建一个组合控件时,我们从现有控件创建一个新的控件。

每个 ASP.NET 控件都有一个Controls属性,它表示它的所有子控件。如果我们向一个控件添加子控件,那么当父控件被呈现时,子控件会自动被呈现。

当我们创建一个组合控件时,我们通常会重写控件的CreateChildControls()方法。当控件构建其子控件集合时,将调用此方法。

在下面的示例中,该控件组合了一个TextBox控件和一个RequiredFieldValidator控件。

RequiredTextBox.Cs 的代码

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Web.UI.WebControls;

namespace RequiredTextBox
{
    public class RequiredTextBox : CompositeControl
    {
        private TextBox input;

        private RequiredFieldValidator validator;
        public string Text
        {
            get
            {
                EnsureChildControls();
                return input.Text;
            }
            set
            {
                EnsureChildControls();
                input.Text = value;
            }
        }

        protected override void CreateChildControls()
        {
            input = new TextBox();
            input.ID = "input";
            this.Controls.Add(input);

            validator = new RequiredFieldValidator();
            validator.ID = "valInput";
            validator.ControlToValidate = input.ID;
            validator.ErrorMessage = "(Required)";
            validator.Display = ValidatorDisplay.Dynamic;
            this.Controls.Add(validator);
        }
    }
}

构建解决方案,然后您将在项目的 *bin* 中找到所需的 *Textbox.dll*。

请注意,上述示例中的控件继承自基类CompositeControl类。此外,该控件没有重写基控件的RenderContents()方法,而是重写了基控件的CreateChildControls()方法。

我们应该注意示例中的另一件事。请注意,EnsureChildControls()方法在Text属性的GetSet方法中都被调用。EnsureChildControls()方法强制调用CreateChildControls()方法。但是,它防止CreateChildControls()方法被多次调用。

Text属性获取或设置子控件(TextBox控件)的属性。如果您在调用CreateChildControls()方法之前尝试使用Text属性,那么您会收到一个null引用异常。必须先创建子控件,然后才能访问任何子控件属性。

以下步骤说明了我们如何在页面中使用RequiredTextBox控件。

现在我们必须将 *RequiredTextBox.dll* 添加到 Toolbox

  • 启用 ToolBox 选择任何选项卡,然后右键单击并单击选择项。

  • 然后您将得到选择工具箱项弹出窗口,从中浏览您的 *RequiredTextBox.dll*。

    单击确定,如下所示

  • 现在您可以在工具箱中找到您的自定义控件。

  • 现在您可以像其他所有控件一样使用它,只需将此控件拖放到需要它的任何地方。
  • 当您拖放此控件时,源代码如下所示
    <cc1:RequiredTextBox ID="RequiredTextBox1" runat="server" Text="Required" />
© . All rights reserved.