1.在asp.net中,(传统意义上)可供你开发的控件实际上有两种:
(1)Custom Control:Custom Control 是纵向的,是对系统本身控件的继承和扩充,在程序中以DLL文件形式存在。
(2)User Control:User Control 则是横向的,是对系统本身控件的组合,在系统中以.ascx为后缀名。
相比之下前者具有更大的灵活性,同时开发起来比较复杂,而后者容易开发,但可重用性就比较差。一般来说用户会先用User Control来开发,只有当其不堪重用的时候才转而使用Custom Control。
2.常见的4种自定义控件:
有时候针对不同的项目我们可能要开发不同用项的服务器控件,比如说特殊用途的DataGrid;有时候我们可能会被要求开发一些常用的控件,比如说像Chart、TreeView、Menu等这一类通用控件。针对于此,你可能会有四种不同的选择:
(1)创建一个用户控件,用它封装其用户界面 (UI) 的服务器控件,无需编写任何额外的代码。
(2)开发一个编译控件,该控件结合了两个或多个现有控件的功能。例如,需要一个封装一个按钮和一个文本框的控件。可以使用复合控件来完成。
(3)从现有控件中派生并重写其属性、方法或事件来自定义现有控件。
(4)从基本控件类之一派生来创建自定义控件。
以上四种方式从难度上来讲顺序依次复杂,使用原则如前所述,只有当前者达不到项目要求时才需考虑后者,一般来说,开发用户控件所使用的编程模型与后三个有着很大不同,它更类似于Asp.Net页的开发。
3.Custom Control的开发与使用:
(1)只需要定义一个直接或间接从Control派生的类,并重写Reader方法即可。
(2)两个常见的服务器控件基类:
System.Web.UI.Control;
System.Web.UI.WebControls.WebControl;
Control 类定义了所有服务器控件共有的属性、方法和事件。其中包括控制控件执行生命周期的方法和事件,以及 ID、UniqueID、Parent、ViewState 和 Controls(子控件集合)等属性。Control 没有用户界面 (UI) 特定的任何功能。如果创作的控件没有提供 UI,或者组合了其他呈现其自己的 UI 的控件,则从 Control 派生。
WebControl 类是从 Control 派生的,并为 UI 功能提供附加的属性和方法。这些属性包括 ForeColor、BackColor、Font、BorderStyle、Height 和 Width。WebControl 是 ASP.NET 中 Web 服务器控件系列的基类。如果控件呈现 UI,则从 WebControl 派生。
(3)Reader方法
Render 方法采用 System.Web.UI.HtmlTextWriter 类型的参数。控件要发送到客户端的 HTML 作为字符串参数传递到 HtmlTextWriter 的 Write 方法。
4.在VS中实现:
(1)新建一个空白解决方案,然后为其添加两个项目:
一个叫做Web的Web应用程序项目。(用于测试我们开发出的控件)
一个名为MyControls的Web控件库项目。
(2)为Web项目选择依赖项和添加引用。
在Web项目上点击右键,选择依赖项,使项目Web取决于MyControls,接着再为Web项目添加MyControls的引用(编译成的MyControls.dll文件后被copy到Web目录的Bin文件夹下,你可以在任何地方使用这个MyControls.dll文件)。
(3)在Web项目中的WebForm1.aspx文件首行添加如下代码(用于向页面注册此控件):
<%@ Register TagPrefix="ccs" Namespace="MyControls" Assembly="MyControls" %>
(4)在<Form>标记之间添加如下代码(添加此控件到页面上):
<ccs:MyControl id="Control1" runat="server" Text="Hello World"></ccs:MyControl>
(5)看一下这个自定义控件源文件(MyControl.cs)的组成。
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
namespace MyControls
{
// Attribute DefaultProperty指定组件的默认属性,ToolboxData指定当从IDE工具中的
//工具箱中拖动自定义控件时为它生成的默认标记
[DefaultProperty("Text"),
ToolboxData("<{0}:MyControl runat=server></{0}:MyControl>")]
//类MyControl派生自WebControl
public class MyControl : System.Web.UI.WebControls.WebControl
{
private string text;
//Attribute Bindable指定属性是否通常用于绑定
//Category指定属性或事件将显示在可视化设计器中的类别
//DefalutValue用于指定属性的默认值
[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string Text
{
get
{
return text;
}
set
{
text = value;
}
}
//重写WebControl的Render方法,采用HtmlTextWriter类型的参数
protected override void Render(HtmlTextWriter output)
{
//发送属性Text的值到浏览器
output.Write(Text);
}
}
}
现在我们略略修改一下Render方法的输出值,试着为输出文本加上标签Span:
output.Write("<span>"+Text+"</span>");
也可以用标签修饰文本的显示:
output.Write("<span><b>"+Text+"</b></span>");