为 ASP.NET 1.1 开发自定义数据绑定 Web 服务器控件
更新:2007 年 11 月
ASP.NET 数据绑定 Web 服务器控件为代表记录集合或项集合的数据源提供一个用户界面 (UI)。GridView Web 服务器控件概述、DataList Web 服务器控件概述和 Repeater Web 服务器控件概述服务器控件是数据绑定 Web 服务器控件的示例。有关 ASP.NET 附带的数据绑定控件的更多信息,请参见 ASP.NET 数据绑定 Web 服务器控件概述。
本主题介绍了实现兼容自定义 ASP.NET 版本 1.1 的最低版本的数据绑定服务器控件所需的步骤。有关在 ASP.NET 版本 2.0 中创建自定义数据绑定控件的更多信息,请参见为 ASP.NET 2.0 开发自定义数据绑定 Web 服务器控件。有关自定义控件的通用结构和实现的更多信息,请参见开发自定义 ASP.NET 服务器控件和演练:开发和使用自定义服务器控件。
何时创建自定义数据绑定控件
在创建自己的自定义数据绑定控件之前,请查看 ASP.NET 已附带的数据绑定控件的功能。现有控件可能已经满足您的需求,或者您可能决定创建自定义控件以扩展已提供所需的多个功能的现有控件。有关 ASP.NET 附带的数据绑定控件的更多信息,请参见 ASP.NET 数据绑定 Web 服务器控件概述。
下面提供了可能促使您决定创建自定义数据绑定控件的一些原因:
您的特定需求需要现有数据绑定控件中不具备的自定义 UI、自定义数据排序功能或自定义数据编辑功能。
您希望创建预编译和可再发行的自定义数据绑定控件。
您希望扩展 ASP.NET 已附带的数据绑定控件的功能。
您希望创建带有符合您特定需求的自定义设计器的数据绑定控件。
自定义数据绑定控件的基本功能
通过从 Control 或 WebControl 类派生,您的自定义数据绑定控件自动继承许多内置功能,其中包括:
支持数据绑定表达式的显式数据绑定模型。ASP.NET 显式数据绑定模型只在需要时执行数据绑定,而不是每次回发时都执行数据绑定。当页执行了第一个数据绑定请求后,后面的请求则尝试从视图状态检索数据。这样无需在每次请求时都重新连接到数据源,从而提高了性能。
对数据绑定表达式的支持使得页开发人员能够在控件的特别标记的公开属性和数据源之间创建绑定。有关数据绑定表达式的更多信息,请参见数据绑定表达式概述。
使用可用设计时功能
您可能希望为自定义数据绑定控件考虑可用于所有 Web 服务器控件的设计时功能。您可以为自定义控件创建设计器类和控件模板。当您在可视的设计图面(例如,Visual Studio 中的“设计”视图)上使用控件时将调用这些功能。
创建控件设计器可以在设计时提供能够使页开发人员自定义控件属性的设计时接口,来显著提高自定义控件的可用性。有关 ASP.NET 控件设计器的概述,请参见 ASP.NET 控件设计器概述。有关示例,请参见 HierarchicalDataBoundControlDesigner 和演练:为 Web 服务器控件创建基本控件设计器。
通过创建模板化控件,可以使页开发人员灵活地指定用于定义控件的用户界面的控件和标记。有关自定义模板化控件的示例,请参见模板化服务器控件示例。
在 ASP.NET 中实现自定义数据绑定控件
下表总结了特定于在 ASP.NET 1.1 中实现数据绑定服务器控件的要求。另外,在此表的后面,您还将找到有关每个实现要求的更多详细信息。
要求 |
说明 |
---|---|
公开 DataSource 属性。 |
使应用您的控件的页开发人员能够指定要绑定到的数据源。 |
重写 DataBind 方法,并创建用于枚举关联的数据源中对象的逻辑。 |
在此方法的逻辑中:
|
通过重写 CreateChildControls 方法来创建子控件层次结构 |
回发时,重新创建子控件并将其绑定到在前面的 DataBind 调用期间在视图状态中存储的数据。 |
说明: |
---|
考虑创建由 DataBind 和 CreateChildControls 方法调用的单一帮助器方法以创建子控件层次结构。例如,创建子控件层次结构的帮助器方法可以接受一个 Boolean 值,这指示数据来自绑定源或视图状态。此模式将控件的子控件层次结构的创建保存在一个公共代码路径中。有关此模式的示例,请参见演练:为 ASP.NET 1.1 创建自定义数据绑定 ASP.NET Web 控件。 |
公开 DataSource 属性
从 Control 或 WebControl 派生的 ASP.NET 1.1 数据绑定控件必须公开 DataSource 属性,以使页开发人员能够选择您的服务器控件要绑定到的数据集合。运行时,自定义数据绑定控件在创建并绑定 UI 元素以代表数据时,将枚举分配到 DataSource 属性的数据集合。
数据绑定服务器控件可绑定到如下类型:
实现 IEnumerable 接口的对象(如 Array、ArrayList 或 Hashtable 对象)。
实现 IListSource 接口的对象(如 DataSet 对象)。
下面的代码示例演示如何公开数据绑定控件的 DataSource 属性。将 DataSource 类型声明为 IEnumerable 类型。
<Category("Data"), DefaultValue(""), Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")> _
Public Overridable Property DataSource() As IEnumerable
Get
Return _dataSource
End Get
Set(ByVal value As IEnumerable)
If TypeOf value Is IEnumerable OrElse value Is Nothing Then
_dataSource = value
Else
Throw New ArgumentException()
End If
End Set
End Property
[
Category("Data"),
DefaultValue(""),
Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")
]
public virtual IEnumerable DataSource
{
get
{
return _dataSource;
}
set
{
if ((value is IEnumerable) || (value == null))
{
_dataSource = value;
}
else
{
throw new ArgumentException();
}
}
}
此示例以元数据属性(如 [Category]、[DefaultValue] 和 [Description])开头,这些属性提供了设计工具、ASP.NET 页分析器、ASP.NET 运行库和公共语言运行库 (CLR) 使用的信息。BindableAttribute 通知可视化设计器属性浏览器可以在对话框中显示控件的可绑定属性。(例如,在 Visual Studio 中,可绑定属性显示在**“数据绑定”**对话框中。)CategoryAttribute 指定如何在可视化设计器的属性浏览器中对属性进行分类。有关元数据属性(包括此示例中使用的元数据属性)的更多信息,请参见自定义服务器控件的元数据属性。
DataSource 属性的 set 访问器验证要设置的值是 null 还是属于 IEnumerable 类型。因此,在此示例中,页开发人员可以将数据绑定到任何 IEnumerable 类型,如 Array、ArrayList 或 Hashtable。另外,在 IEnumerable 类型的合适的数据源可用之前,开发人员还可以将 DataSource 设置为 null。
说明: |
---|
如果希望您的自定义数据绑定服务器控件能够绑定到 IEnumerable 或 IListSource 数据类型,您可以将 DataSource 属性声明为泛型类型 Object。在此情况下,公开 DataSource 属性的 set 访问器必须验证传送到它的对象的类型,然后实现 IEnumerable 或 IListSource。 |
重写 DataBind 方法并枚举关联的数据源
您提供对自定义控件中的 DataBind 基方法的重写以便能够执行以下两项任务:枚举绑定数据集合以及创建将代表该数据的子控件层次结构。下表总结了必须在重写的 DataBind 方法内执行的任务:
调用自定义控件的 OnDataBinding 基方法。
清除任何现有子控件。
清除所有子控件视图状态。
跟踪状态,以便数据绑定期间的更改保持在视图状态中。
创建子控件层次结构。
将 ChildControlsCreated 属性设置为 true。
以此操作为开头:在控件中重写的 DataBind 方法内,调用控件的 OnDataBinding 基方法。调用控件的 OnDataBinding 基方法会导致计算控件的所有数据绑定表达式。下面的代码示例演示如何执行第一项任务,即在数据绑定服务器控件的重写的 DataBind 方法中调用该控件中的 OnDataBinding 方法。
public override void DataBind()
{
base.OnDataBinding(EventArgs.Empty);
}
Public Overrides Sub DataBind()
MyBase.OnDataBinding(EventArgs.Empty)
End Sub
然后,清除现有的子控件。因为每次回发时都必须根据要绑定的数据来重新创建子控件层次结构,所以必须通过调用控件的继承的 Clear 方法来清除任何现有子控件(如下面的代码示例所示)。
public override void DataBind()
{
base.OnDataBinding(EventArgs.Empty);
Controls.Clear();
}
Public Overrides Sub DataBind()
MyBase.OnDataBinding(EventArgs.Empty)
Controls.Clear()
End Sub
将创建新子控件来代表新绑定数据,因此必须放弃现有子控件的任何视图状态。您可以通过调用控件的继承的 ClearChildViewState 方法来清除所有子控件的视图状态。
清除任何现有子控件的视图状态后,您可以通过调用负责跟踪视图状态的、控件的继承的 TrackViewState,来启动控件的视图状态跟踪。控件的状态跟踪是在创建子控件层次结构之前启动的,因此数据绑定过程中子控件层次结构中的任何更改都会保留在视图状态中。由于页开发人员可以在页的 PreInit 事件过程中调用 DataBind,因此您不能依赖您的控件的基类来跟踪页生命周期的此阶段之后出现的视图状态。在这种情况下,控件的视图状态跟踪在该过程中将会出现地太迟。
下面的代码示例演示数据绑定服务器控件如何调用其 TrackViewState 方法。
public override void DataBind()
{
TrackViewState();
}
Public Overrides Sub DataBind()
TrackViewState()
End Sub
然后,创建子控件层次结构。子控件层次结构以可视方式代表此数据源:自定义数据控件绑定到的且在控件的基类调用自定义控件的重写的 DataBind 或 CreateChildControls 方法时创建。当控件的基类调用控件的重写的 DataBind 时,会根据绑定数据源创建控件的子层次结构。当基类调用控件的重写的 CreateChildControls 方法时,会根据在视图状态中保存的数据创建子控件层次结构。
调用控件的 DataBind 方法会触发子控件层次结构的创建。控件枚举公开的 DataSource 属性提供的数据并实例化新的子控件以代表每个数据项。例如,如果数据源是要绑定到 Button 控件的 Text 属性的字符串数组,则会循环访问该数组,并通过其分配到代表字符串的循环访问的数据项的 Text 属性来创建新的 Button 控件。
创建子控件层次结构后,将 ChildControlsCreated 属性设置为 true 以指示不应通过基类调用 CreateChildControls 方法。
下面的代码示例演示数据绑定服务器控件如何将其 ChildControlsCreated 属性设置为 true。
public override void DataBind()
{
ChildControlsCreated = true;
}
Public Overrides Sub DataBind()
ChildControlsCreated = True
End Sub
自定义数据绑定控件类必须提供重写的 CreateChildControls 方法,控件在该方法内重新创建其子控件层次结构并允许应用保存的视图状态。(在最近一次调用控件的 DataBind 方法时跟踪保存的视图状态。)
下表总结了必须在重写的 CreateChildControls 方法内执行的任务:
清除任何现有子控件。
如果视图状态可用,则创建子控件层次结构。
在重新创建子控件层次结构之前,必须清除任何现有的子控件对象。该操作可以通过调用控件的 Clear 方法来完成。
下面的代码示例演示数据绑定服务器控件如何调用其 Clear 方法。
public override void CreateChildControls()
{
Controls.Clear();
}
最后一步,创建子控件层次机构。如果视图状态可用,CreateChildControls 方法必须重新创建子控件层次结构。只要在相同的层次结构中创建相同数量和类型的子控件,保存的视图状态便会应用到子控件。控件可以将它执行以下操作所需的信息保存在 ViewState 属性中:重新创建相同数量、类型和层次结构的子控件。有关保存控件视图状态的更多信息,请参见 ViewState。有关演示在自定义数据绑定控件中创建子控件层次结构的完整的代码示例,请参见演练:为 ASP.NET 1.1 创建自定义数据绑定 ASP.NET Web 控件。
生成自定义服务器控件
有关生成自定义数据绑定 Web 服务器控件以及在网页中使用该控件的信息,请参见生成自定义服务器控件示例。
说明: |
---|
必须向 System.Design 程序集添加引用才能将其包括在编译中。 |
请参见
任务
演练:为 ASP.NET 1.1 创建自定义数据绑定 ASP.NET Web 控件
概念
参考
HierarchicalDataBoundControlDesigner