自定义控件






4.83/5 (5投票s)
如何添加自定义控件。
自定义控件构建概述
当我们创建一个组合控件时,我们从现有控件构建一个新的控件。例如,我们可以从现有的TextBox
和RequiredFieldValidator
控件创建一个组合的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
类。每个控件,包括TextBox
和GridView
控件,最终都派生自这个控件。这意味着System.Web.UI.Control
类的所有属性、方法和事件都由框架中的所有控件共享。
所有 Web 控件都继承自基类System.Web.UI.WebControls.WebControl
。Control
类和WebControl
类之间的区别在于,派生自WebControl
类的控件始终具有开始和结束标签。由于WebControl
有开始和结束标签,我们也获得了更多的格式化选项。例如,WebControl
类包括BackColor
、Font
和ForeColor
属性。
例如,ASP.NET Literal 控件继承自基类Control
,而Label
控件继承自基类WebControl
。Repeater
控件继承自基类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*。
请注意,上述示例中的控件继承自基类Comp
类。此外,该控件没有重写基控件的ositeControl
RenderContents()
方法,而是重写了基控件的CreateChildControls()
方法。
我们应该注意示例中的另一件事。请注意,EnsureChildControls()
方法在Text
属性的Get
和Set
方法中都被调用。EnsureChildControls()
方法强制调用CreateChildControls()
方法。但是,它防止CreateChildControls()
方法被多次调用。
Text
属性获取或设置子控件(TextBox
控件)的属性。如果您在调用CreateChildControls()
方法之前尝试使用Text
属性,那么您会收到一个null
引用异常。必须先创建子控件,然后才能访问任何子控件属性。
以下步骤说明了我们如何在页面中使用RequiredTextBox
控件。
现在我们必须将 *RequiredTextBox.dll* 添加到 Toolbox
- 启用
ToolBox
选择任何选项卡,然后右键单击并单击选择项。 - 然后您将得到选择工具箱项弹出窗口,从中浏览您的 *RequiredTextBox.dll*。
单击确定,如下所示
- 现在您可以在工具箱中找到您的自定义控件。
- 现在您可以像其他所有控件一样使用它,只需将此控件拖放到需要它的任何地方。
- 当您拖放此控件时,源代码如下所示
<cc1:RequiredTextBox ID="RequiredTextBox1" runat="server" Text="Required" />