ASP.NET 开发者食谱 第三章:自定义控件






4.86/5 (13投票s)
2004年2月18日
15分钟阅读

90847
构建 ASP.NET 自定义控件最常见的技术。
![]() |
|
3.0. 引言
ASP.NET 最强大的功能之一是它对自定义服务器控件和组件的支持。ASP.NET 附带了数十个内置控件,开发者可以轻松地扩展这些控件或从头开始编写自己的控件。服务器控件可用于封装复杂的 UI 逻辑或业务规则,并可以受益于设计时支持,如拖放和工具箱支持以及属性生成器。自定义控件在用户控件的基础上进行了扩展,提供了更大的灵活性、可重用性和更好的设计时体验,但同时也增加了一些复杂性。在本章中,您将找到涵盖一些最常见服务器控件技术的示例。
自定义控件通常直接或间接继承自 System.Web.UI.Control
基类。在页面上可见的控件应直接或间接继承自 System.Web.UI.WebControls.WebControl
,它提供了 Style
等属性,您可以使用它们来确定控件在页面上的外观。可以通过多种方式构建自定义控件。有些控件只是重写 Render()
方法,从而在运行时确定控件的 HTML 输出。其他控件,称为复合控件,充当其他控件的容器。还有些控件继承自现有的功能齐全的控件,以创建这些控件的更特定版本或增强其功能。
ASP.NET 中的控件可以支持数据绑定和模板。事实上,关于构建控件的信息足以写一整本书(事实上,确实有一本这样的书,并在本节末尾列出),因此本章试图涵盖您将使用的最常见技术,将大部分理论留给专门讲解控件构建的其他书籍。
参见 - 开发 ASP.NET 服务器控件和组件,作者 Nikhil Kothari 和 Vandana Datye (Microsoft Press; ISBN 0735615829)
3.1. 声明一个简单的自定义控件
您想创建一个简单的自定义控件来输出一些文本。
技术
此示例演示了在 ASP.NET 中创建自定义控件的容易程度,尤其是与 COM 组件相比。您只需创建一个继承自 System.Web.UI.Control
或 System.Web.UI.WebControls.WebControl
的类,并赋予它所需的任何属性和方法。在 Visual Studio .NET 中,通常会通过创建一个新的 Web 控件库项目来完成此操作。您可以重写其 Render()
方法来控制其输出,从而获得一个简单而强大的工具来封装和重用 UI 逻辑。
Recipe0301vb
类如下所示
Imports System.ComponentModel
Imports System.Web.UI
Namespace AspNetCookbook
<DefaultProperty("Text"), ToolboxData("<{0}:Recipe0301vb
runat=server></{0}:Recipe0301vb>")> Public Class Recipe0301vb
Inherits System.Web.UI.WebControls.WebControl
Dim _text As String
<Bindable(True), Category("Appearance"),
DefaultValue("")> Property [Text]() As String
Get
Return _text
End Get
Set(ByVal Value As String)
_text = Value
End Set
End Property
Protected Overrides Sub Render(
ByVal output As System.Web.UI.HtmlTextWriter)
output.Write([Text])
End Sub
End Class
End Namespace
要引用 Web 窗体上的自定义控件,您需要在页面上添加一个 Register
指令,并指定三个参数。 TagPrefix
用于此命名空间和程序集的所有控件在页面上声明时使用,可以是除了 asp
之外的任何内容,因为 asp
是为 ASP.NET 提供的内置 Web 控件保留的。接下来,必须指定控件所在的命名空间。最后,为 Assembly
参数指定程序集的名称,不带任何路径信息或 .DLL 扩展名。以下是一个示例
<%@ Page language="VB" %>
<%@ Register TagPrefix="AspNetCookbook" Namespace="AspNetCookbook"
Assembly="RecipesVB" %>
...
<form id="Form1" method="post" runat="server">
<AspNetCookbook:Recipe0301vb id="Recipe0301vb1" runat="server" />
</form>
注释
请注意,在 Visual Studio .NET 中,具有与项目相同名称的默认命名空间会自动添加到所有 Visual Basic 类名之前。这是混淆的一个常见来源,并且与 C# 中处理默认命名空间的方式不一致,在 C# 中,它们作为可见的命名空间插入到每个类文件中。您可以在“项目属性”对话框中将默认命名空间设置为空字符串来禁用此默认行为。您可以使用生成的程序集上的 ILDASM.EXE 命令行工具,或者通过进入 Visual Studio .NET 中的类视图实用程序来确定类的完整命名空间。
3.2. 扩展现有的 Web 控件
您想扩展现有 Web 控件的功能。
技术
此示例演示了如何扩展现有控件(Label
控件)的功能,并将其变成 RainbowLabel
。这是通过使用继承来实现的—RainbowLabel
是 System.Web.UI.WebControls.Label
类的子类。
RainbowLabel
类如下所示
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.ComponentModel
Public Class RainbowLabel
Inherits System.Web.UI.WebControls.Label
Public Property EnableRainbowMode() As Boolean
Get
If ViewState("EnableRainbowMode") Is Nothing Then
Return True
Else
Return Boolean.Parse(CStr(ViewState("EnableRainbowMode")))
End If
End Get
Set(ByVal Value As Boolean)
ViewState("EnableRainbowMode") = Value
End Set
End Property
Protected Overrides Sub Render(ByVal output As HtmlTextWriter)
If EnableRainbowMode Then
output.Write(ColorizeString([Text]))
Else
output.Write([Text])
End If
End Sub 'Render
Private Function ColorizeString(ByVal input As String) As String
Dim output As New System.Text.StringBuilder(input.Length)
Dim rand As Random = New Random(DateTime.Now.Millisecond)
Dim i As Integer
For i = 0 To input.Length - 1
Dim red As Integer = rand.Next(0, 255)
Dim green As Integer = rand.Next(0, 255)
Dim blue As Integer = rand.Next(0, 255)
output.Append("<font color=""#")
output.Append(Convert.ToString(red, 16))
output.Append(Convert.ToString(green, 16))
output.Append(Convert.ToString(blue, 16))
output.Append(""">")
output.Append(input.Substring(i, 1))
output.Append("</font>")
Next i
Return output.ToString()
End Function
End Class
要使用此控件,您需要执行以下操作:
<%@ Page language="VB" %>
<%@ Register TagPrefix="AspNetCookbook" Namespace="AspNetCookbook"
Assembly="AspNetCookbook" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
<title>03 Custom Controls - 02 Extending Existing Web Controls</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<AspNetCookbook:RainbowLabel text="This is a rainbow colored test string"
runat="server"/><br />
<AspNetCookbook:RainbowLabel EnableRainbowMode="false"
text="This is a test string" runat="server"/>
</form>
</body>
</html>
注释
此控件会在其显示的文本中创建彩虹般的图案。这是通过将每个字符封装在 <font>
标签中实现的。每个字符的颜色都是随机的。虽然这可能不是最有用的控件,但它确实演示了扩展现有 Web 控件功能的容易程度。值得注意的是,不应忽视 Label
控件作为一个强大的基础控件——所有验证控件都继承自简单的 Label
控件。
参见 - 第 3.1 节,“声明一个简单的自定义控件”
开发 ASP.NET 服务器控件和组件,作者 Nikhil Kothari 和 Vandana Datye (Microsoft Press; ISBN 0735615829)
3.3. 创建支持 ViewState 的控件属性
您希望您的控件属性能够使用 ViewState 保留其状态。
技术
此示例向您展示了如何为您的控件创建能够使用 ViewState 保留其状态的属性。
ViewStateControl
类
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.ComponentModel
Public Class ViewStateControl
Inherits System.Web.UI.WebControls.WebControl
Public Property [Text]() As String
Get
Dim _text As String = CStr(ViewState("Text"))
If _text Is Nothing Then
Return String.Empty
Else
Return _text
End If
End Get
Set(ByVal Value As String)
ViewState("Text") = Value
End Set
End Property
Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
writer.Write([Text])
End Sub
End Class
要使用此控件,您需要执行以下操作:
<%@ Page language="VB" %>
<%@ Register TagPrefix="AspNetCookbook" Namespace="AspNetCookbook"
Assembly="AspNetCookbook" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
<title>Recipe0303</title>
</head>
<body>
<script language="VB" runat="server">
Sub Page_Load(Sender As Object, E As EventArgs)
If Not IsPostBack Then
Dim RandomGenerator As Random
RandomGenerator = New Random(DateTime.Now.Millisecond)
ViewStateControl1.Text = RandomGenerator.Next(1,100)
End If
End Sub
</script>
<form id="Form1" method="post" runat="server">
<AspNetCookbook:ViewStateControl id="ViewStateControl1" runat="server"/>
<asp:linkbutton text="PostBack test" runat="server"/>
</form>
</body>
</html>
注释
这个名为 Text
的控件属性将在回发时保留其状态——如您所见,通过使用 ViewState
属性可以很容易地使属性保留其状态,并且此技术推荐用于大多数 Web 控件属性。
参见 - 第 3.1 节,“声明一个简单的自定义控件”
3.4. 创建复合控件
您想将两个或多个 Web 控件组合成一个复合自定义控件。
技术
此示例演示了如何创建一个非常简单但有用的复合控件。该控件是 TextBox
和验证器的组合,并且该控件可用于验证电子邮件地址。EmailTextBox
类如下所示
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.ComponentModel
Imports System.ComponentModel.Design
Namespace AspNetCookbook
Public Class EmailTextBox
Inherits System.Web.UI.WebControls.WebControl
Implements INamingContainer
Private textBox As textBox
Private validator As RegularExpressionValidator
Public Property Text() As String
Get
EnsureChildControls()
Return textBox.Text
End Get
Set(ByVal Value As String)
EnsureChildControls()
textBox.Text = Value
End Set
End Property
Public Property ErrorMessage() As String
Get
EnsureChildControls()
Return validator.ErrorMessage
End Get
Set(ByVal Value As String)
EnsureChildControls()
validator.ErrorMessage = Value
End Set
End Property
Public Overrides ReadOnly Property Controls() As ControlCollection
Get
EnsureChildControls()
Return MyBase.Controls
End Get
End Property
Protected Overrides Sub CreateChildControls()
Controls.Clear()
textBox = New TextBox
validator = New RegularExpressionValidator
Controls.Add(textBox)
Controls.Add(validator)
textBox.ID = "Email1"
validator.ControlToValidate = textBox.ID
'A typical email address regular expression
validator.ValidationExpression = _
"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3} \.[0-9]{1,3}\." & _
"[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+)) ([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"
End Sub
End Class
End Namespace
要使用此控件,您需要执行以下操作:
<%@ Page language="VB" %>
<%@ Register TagPrefix="AspNetCookbook" Namespace="AspNetCookbook"
Assembly="AspNetCookbook" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
<title>Recipe0304</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<AspNetCookbook:EmailTextBox
ID="EmailTextBox1"
ErrorMessage="You must provide a valid email address!"
runat="server"
/>
</form>
</body>
</html>
注释
此控件会验证 TextBox
中的输入。如果输入不是有效的电子邮件地址,则会出现错误消息。像此控件这样的控件对于包含大量需要验证的用户输入的页面很有用。您可以轻松地扩展此控件以使用多种验证器类型,允许页面开发人员定义自己的验证表达式,等等。
参见 - 正则表达式库—http://regexlib.com/
3.5. 创建数据绑定控件
您想创建一个支持数据绑定的自定义控件。
技术
此示例演示了如何创建一个简单且原创的数据绑定自定义服务器控件—一个数据绑定的项目符号列表。CustomBulletedList
类如下所示
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.ComponentModel
Imports System.Collections
Imports System.Text
Public Class CustomBulletedList
Inherits System.Web.UI.WebControls.WebControl
Private _html As New StringBuilder()
Private _dataSource As IEnumerable
Public Property DataSource() As IEnumerable
Get
Return _dataSource
End Get
Set(ByVal value As IEnumerable)
_dataSource = value
End Set
End Property
Private Sub CreateBulletedList()
Dim dataSource As IEnumerable = Nothing
Try
dataSource = Me._dataSource
Catch
End Try
If Not (dataSource Is Nothing) Then
_html.Append("<ul>")
Dim dataObject As Object
For Each dataObject In dataSource
_html.Append("<li>")
_html.Append(dataObject)
_html.Append("</li>")
Next dataObject
_html.Append("</ul>")
End If
End Sub
Public Overrides Sub DataBind()
MyBase.OnDataBinding(EventArgs.Empty)
CreateBulletedList()
End Sub
Protected Overrides Sub Render(ByVal output As HtmlTextWriter)
output.Write(_html)
End Sub
End Class
要使用此控件,您需要执行以下操作:
<%@ Page Language="VB" %>
<%@ Register TagPrefix="AspNetCookbook" Namespace="AspNetCookbook"
Assembly="AspNetCookbook" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
<title>Data Bound Controls</title>
</head>
<body>
<script language="vb" runat="server">
Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
listControl.DataSource = New String() {"Test 1", "Test 2", "Test 3"}
listControl.DataBind()
End Sub
</script>
<AspNetCookbook:CustomBulletedList id="listControl" runat="server"/>
</body>
</html>
注释
此控件允许您将任何派生自 IEnumerable
的数据源绑定到它—内容将以项目符号格式列出。重写 DataBind
方法是此控件的关键点。调用此方法时,它会尝试绑定到数据源并调用 CreateBulletedList
方法。
CreateBulletedList
遍历数据源中的所有数据对象,并将它们保存以输出为项目符号行。
通过重写 Render
方法,您可以控制控件的渲染,并按您认为合适的方式进行渲染。当性能是问题时(何时不是?),您应该始终选择此方法,因为它比重写 CreateChildControls
方法要快得多。
您应该注意的最后一点是,您应该始终使用 StringBuilder
而不是常规字符串作为 HTML 输出源。使用常规字符串对象会严重降低自定义控件的性能。
参见 - 第 3.6 节,“创建模板化控件”
3.6. 创建模板化控件
您想创建一个支持使用模板的控件。
技术
此示例创建了一个简单的模板化控件。它显示服务器上运行的当前时间,并允许您添加动态文本等。
首先,主控件类,DateTimeControl
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.ComponentModel
Namespace AspNetCookbook
<ToolboxData("<{0}:DateTimeControl runat=server></{0}:DateTimeControl>"), _
ParseChildren(True)> _
Public Class DateTimeControl
Inherits Control
Implements INamingContainer
Private _template As ITemplate
Private _container As DateTimeContainer
Private _text As String
<TemplateContainer(GetType(DateTimeContainer))> _
Public Overridable Property Template() As ITemplate
Get
Return _template
End Get
Set(ByVal Value As ITemplate)
_template = Value
End Set
End Property
Public Overridable ReadOnly Property Container() As DateTimeContainer
Get
Return _container
End Get
End Property
Public Overridable Property Text() As String
Get
Return _text
End Get
Set(ByVal Value As String)
_text = Value
End Set
End Property
Public Overridable ReadOnly Property DateTime() As String
Get
Return System.DateTime.Now.ToShortTimeString()
End Get
End Property
Protected Overrides Sub OnDataBinding(ByVal e As EventArgs)
EnsureChildControls()
MyBase.OnDataBinding(e)
End Sub 'OnDataBinding
Protected Overrides Sub CreateChildControls()
If Not (Template Is Nothing) Then
_container = New DateTimeContainer(Text, DateTime)
Template.InstantiateIn(Container)
Controls.Add(Container)
Else
Controls.Add(New LiteralControl("" + [Text] + " " + DateTime))
End If
End Sub
End Class
现在,让我们看一下容器控件 DateTimeContainer
。它使您能够使用 <%# Container.Text %>
等。
Public Class DateTimeContainer
Inherits Control
Implements INamingContainer
Private _text As String
Private _dateTime As String
Public Sub New(ByVal text As String, ByVal dateTime As String)
Me._text = text
Me._dateTime = dateTime
End Sub 'New
Public ReadOnly Property Text() As String
Get
Return _text
End Get
End Property
Public ReadOnly Property DateTime() As String
Get
Return _dateTime
End Get
End Property
End Class
End Namespace
注释
此控件允许您添加模板,从而选择您想要呈现数据的方式。该控件由两个类构建—DateTimeControl
是您添加到页面上的实际控件,DateTimeContainer
是保存实际模板数据的容器控件。严格来说,如果您不想使用自定义属性,则不需要使用容器类。如果您只想显示静态内容,可以将控件实例化在 Panel
控件或类似控件中。
参见 - 第 3.4 节,“创建复合控件”
第 3.5 节,“创建数据绑定控件”
3.7. 动态向 Web 窗体添加控件
您想以编程方式将控件插入 Web 窗体。
技术
您可以通过使用 Class.Controls.Add()
方法将控件添加到任何公开 Controls()
集合属性的类中。在此示例中,用户选择应将哪个控件添加到页面。PlaceHolder
控件可用于精确指定新控件在 Web 窗体上的显示位置,但对于此技术工作而言,它不是必需的。
ASPX 页面如下所示
<form id="Recipe0307" method="post" runat="server">
<asp:DropDownList id="DropDownList1" runat="server">
<asp:ListItem Value="Simple Text Control (Recipe0301)">
Simple Text Control (Recipe0301)</asp:ListItem>
<asp:ListItem Value="RainbowLabel (Recipe0302)">RainbowLabel
(Recipe0302)</asp:ListItem>
</asp:DropDownList>
<asp:Button id="Button1" runat="server" Text="Select"
onclick="Button1_Click"></asp:Button>
<p>
<asp:PlaceHolder id="PlaceHolder1" runat="server"></asp:PlaceHolder>
</p>
</form>
在 <script runat="server" />
块或代码隐藏中
Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
' Initialize Placeholder
PlaceHolder1.Controls.Clear()
Select Case DropDownList1.SelectedIndex
Case 0:
Dim SimpleText As AspNetCookbook.Recipe0301vb = _
New AspNetCookbook.Recipe0301vb()
SimpleText.Text = "This is the simple text control from Recipe 3.01."
PlaceHolder1.Controls.Add(SimpleText)
Exit Select
Case 1:
Dim RainbowText As AspNetCookbook.RainbowLabel = _
New AspNetCookbook.RainbowLabel()
RainbowText.Text = "This is the RainbowText control from Recipe 3.02."
PlaceHolder1.Controls.Add(RainbowText)
Exit Select
End Select
End Sub
注释
动态创建和插入控件到页面是一项非常强大的技术,您可以轻松地扩展它来创建灵活的页面体系结构。
3.8. 使用 Treeview IE Web 控件
您想使用 TreeView IE Web 控件实现树状视图。
技术
第一步是从 Microsoft 安装 IE Web 控件。下载和安装这些控件的链接如下:MSDN。
下一步是在您的页面上添加对控件的引用
<%@ Register TagPrefix="mytree" Namespace="Microsoft.Web.UI.WebControls"
Assembly="Microsoft.Web.UI.WebControls" %>
<%@ import namespace="Microsoft.Web.UI.WebControls" %>
然后,您将 TreeView
控件添加到您的页面
<mytree:treeview runat="server" id="myTree">
</mytree:treeview>
最后一步是向 TreeView
添加节点信息。这是展开树时将显示的项目的列表
<mytree:treeview runat="server" id="myTree">
<mytree:treenode text="Cars">
<mytree:treenode text="Ford" />
<mytree:treenode text="Toyota" />
<mytree:treenode text="Infiniti" />
</mytree:treenode>
</mytree:treeview>
在这里,我们创建了一个名为 Cars
的节点,然后在该节点下为不同的汽车制造商添加了节点。
注释
TreeView
IE Web 控件是一个非常强大且易于使用的控件。在此示例中,您看到了如何轻松创建类似资源管理器的可展开树。在向 TreeView
添加节点时,您使用一种非常类似 XML 的方法,其中父节点下的节点包含在父节点标签内。如果您在尝试将引用添加到页面时遇到错误,或者收到指示无法找到 Web 控件的错误,请将 Web 控件 DLL 复制到应用程序的 bin 目录。
参见 -
TreeView
控件基础—http://www.aspalliance.com/jamesavery/webcontrols/treeviewp1.aspx第 3.11 节,“数据绑定
TreeView
控件”
Treeview
控件概述—http://msdn.microsoft.com/workshop/webcontrols/overview/treeview.asp
3.9. 使用 TabControl 和 PageView IE Web 控件
您想使用 IE Web 控件 TabControl 和 PageView 来实现标签式界面或类似向导的表单。
技术
第一步是从 Microsoft 安装 IE Web 控件。下载和安装这些控件的链接如下:MSDN。
接下来,您需要在页面上添加对 Web 控件的引用
<%@ Register TagPrefix="ieControls"
Namespace="Microsoft.Web.UI.WebControls"
Assembly="Microsoft.Web.UI.WebControls" %>
<%@ import namespace="Microsoft.Web.UI.WebControls" %>
然后,您添加标签带。这是生成用户单击以切换页面的标签的控件
<IECONTROLS:TABSTRIP id="myTabStrip" runat="server" TargetID="myMultiPage"
Orientation="Vertical">
<IECONTROLS:Tab Text="Tab 1"></IECONTROLS:Tab>
<IECONTROLS:TabSeparator></IECONTROLS:TabSeparator>
<IECONTROLS:Tab Text="Tab 2"></IECONTROLS:Tab>
<IECONTROLS:TabSeparator DefaultStyle="height:100%;">
</IECONTROLS:TabSeparator>
</IECONTROLS:TABSTRIP>
最后,您需要添加您的多页控件,其中包含用户选择每个标签时将查看的不同页面
<IECONTROLS:MULTIPAGE id="myMultiPage" runat="server">
<IECONTROLS:PAGEVIEW>
Page 1
</IECONTROLS:PAGEVIEW>
<IECONTROLS:PAGEVIEW>
Page 2
</IECONTROLS:PAGEVIEW>
</IECONTROLS:MULTIPAGE>
注释
请注意,标签带控件上有一个名为 TargetID
的属性。必须将其设置为将与标签带一起工作得多页控件的 ID。当用户单击标签时,标签带将通知 PageView
显示相应的页面。在使用多页控件时,您可以在 PageView
标签的开头和结尾之间添加任何类型的 ASP.NET 或 HTML。在此示例中,标签带是垂直运行的,但您也可以将此值设置为水平。为此,只需将 Orientation
属性设置为 horizontal 即可。
参见 -
TabStrip
控件概述—http://msdn.microsoft.com/workshop/webcontrols/overview/tabstrip.asp
MultiPage
控件概述—http://msdn.microsoft.com/workshop/webcontrols/overview/multipage.asp
3.10. 使用 ToolBar IE Web 控件
您想使用 ToolBar IE Web 控件来实现工具栏。
技术
第一步是从 Microsoft 安装 IE Web 控件。下载和安装这些控件的链接如下:MSDN。
接下来,您需要在页面上添加对 Web 控件的引用
<%@ Register TagPrefix="ieControls"
Namespace="Microsoft.Web.UI.WebControls"
Assembly="Microsoft.Web.UI.WebControls" %>
<%@ import namespace="Microsoft.Web.UI.WebControls" %>
然后,您将工具栏添加到您的页面
<iecontrols:Toolbar id="myToolbar" runat="server">
</ie:Toolbar>
最后,您添加想要显示在工具栏上的按钮
<iecontrols:Toolbar id="myToolbar" runat="server">
<iecontrols:ToolbarButton Text="First Button" />
<iecontrols:ToolbarSeparator />
<iecontrols:ToolbarButton Text="<b>Second Button</b>" />
</iecontrols:Toolbar>
注释
工具栏控件是一种快速实现漂亮工具栏的便捷方式。请注意,在此示例中,您甚至可以在按钮文本中添加丰富内容。这使您可以在按钮上使用 HTML。您还可以设置按钮标签的 ImageUrl
属性来使用图像作为按钮。
参见 -
ToolBar
控件概述—http://msdn.microsoft.com/workshop/webcontrols/overview/toolbar.asp
3.11. 数据绑定 TreeView 控件
您想通过使用 XML 和 TreeView IE Web 控件来使用 XML 和 TreeView IE Web 控件填充树状视图。
技术
如果您以前没有使用过 TreeView
控件,请参考第 3.8 节了解基本的 TreeView
信息。首先,您需要在页面上添加 TreeView
并将 treenodesrc
属性设置为您将要创建的 XML 文件。
<mytree:treeview runat="server" id="myTree" treenodesrc="cars.XML">
</mytree:treeview>
接下来,您需要创建将用于绑定 TreeView
的 XML 文件
<?xml version="1.0" encoding="utf-8" ?>
<TREENODES>
<treenode text="Cars">
<treenode text="Ford" />
<treenode text="Toyota" />
<treenode text="Infiniti" />
</treenode>
</TREENODES>
当页面加载时,TreeView
将从 XML 文件生成其节点。
注释
无法直接将 DataSet
数据绑定到 TreeView
Web 控件。数据必须先转换为 XML。您可以使用 Response.Write
来编写 XML,或者使用 XSLT 将 DataSet
转换为正确的 XML。使用 XSLT 时,可以使用 TreeView
的 TreeNodeXsltSrc
属性指定 XSLT 文件。除了使用 XML 定义 TreeView
的实际节点外,您还可以使用 XML 通过 TreeView
控件的 TreeNodeTypeSrc
属性定义样式类型。
参见 -
Treeview
控件概述—http://msdn.microsoft.com/workshop/webcontrols/overview/treeview.asp创建动态 TreeViews—http://www.aspalliance.com/jamesavery/webcontrols/treeviewp2.aspx
3.12. 在全局程序集缓存 (GAC) 中安装组件
您希望通过将程序的程序集注册到全局程序集缓存 (GAC) 中,从而从服务器上的任何应用程序访问自定义控件。
技术
.NET Framework 中的全局程序集缓存提供了一个用于注册程序集的中心位置。然后,所有应用程序都可以使用已注册的程序集,包括 Visual Studio .NET 和 Web Matrix 等开发环境。将程序集添加到全局程序集缓存的过程可以与在服务器上注册 COM 组件的过程进行比较,就像在 Windows DNA 应用程序的情况下所做的那样。
将程序集添加到 GAC 所涉及的第一步是为程序集赋予强名称。强名称基本上分配给程序集或组件,以区分 GAC 中存在的其他程序集和组件。强名称由程序集标识(名称、版本等)、公钥和数字签名组成。
为程序集分配强名称可确保其独一无二,具有版本保护和代码完整性。为程序集分配强名称并非难事。您可以使用 sn.exe 实用程序生成强名称,然后将它们添加到程序集的代码中。例如,要为名为 sample.dll 的程序集创建强名称,您将在命令提示符中键入以下命令
c:\MyAssembly>sn -k sample.snk
这将生成一个强名称密钥对并将其存储在名为 sample.snk 的文件中。文件扩展名可以是任何名称,但通常约定使用 .SNK。 -k 选项用于创建强名称密钥对。您可以在 MSDN 中搜索其他选项。
第二步是将生成的强名称文件与程序集关联。将以下代码添加到您的程序集中以关联强名称。默认情况下,Visual Studio .NET 项目会在 AssemblyInfo 文件中包含这些属性的骨架声明。
Imports System.Reflection
<assembly: AssemblyKeyFile("sample.snk")>
请注意,有关包含强名称密钥对的文件的信息放置在任何命名空间声明之前的代码文件中。此外,您必须导入 System.Reflection
命名空间,以便该语句起作用,否则编译器将无法识别 <assembly: AssemblyKeyFile("sample.snk")>
语句。
在编译了包含添加了强名称信息的语句的程序集之后,您现在需要将程序集放入 GAC。您可以通过简单地将程序集复制并粘贴到 GAC 来手动完成此操作,GAC 位于 C:\WINNT\ASSEMBLY\。
您还可以使用 .NET Framework 安装的 gacutil.exe 实用程序。要添加程序集,您将在命令提示符中键入以下命令
gacutil /i sample.dll
/i 选项用于安装。要从 GAC 中删除程序集,您可以使用相同的实用程序,如下所示
gacutil /u sample.dll
/u 选项用于卸载或从缓存中删除程序集。键入 gacutil /? 会列出其所有选项。
参见 - 第 3.1 节,“声明一个简单的自定义控件”
第 3.2 节,“创建复合控件”
命令行编译—http://aspalliance.com/hrmalik/articles/2002/ 200211/20021101.aspx,作者 Haroon Rasheed Malik
.NET 程序集—http://aspalliance.com/hrmalik/articles/2002/200202/ 20020201.aspx,作者 Haroon Rasheed Malik