作者: Scott Mitchell
[概述]
WEB 开发自从有了基于脚本的 WEB 编程技术(如 ASP )以来,经历了一个漫长的过程。通过使用微软的 ASP.Net 技术,传统的 ASP 中大量的、单调乏味的、重复性的编程工作成为了历史。例如,象大多数 ASP 程序员所知的,在 ASP 中显示数据库内容所需要的过程:
建立数据库连接
用 SQL 查询装载 ADO 数据集
显示所需要的任何 HTML 代码
遍历数据集中的记录
输出记录字段值及相关的 HTML
移向下一条记录
循环
显示所需要的 HTML 代码
又如,为了在表格中显示记录集的内容,我们需要输出一个
1<table> 标签,然后开始循环。在循环中,每输出一条记录,需要先输出一个 <tr> 标签以及若干对 <td> 标签和 </td></tr> 标签。最后,以一个 </table>
标签结尾。
在传统的 ASP 中使用的这种方法有一个主要的缺点: HTML 代码与 ASP 源代码不得不纠缠在一起。对于那些也许并不理解程序设计的页面设计者或图形艺术家来说,想要更改 HTML 内容无疑是一场灾难。另外,代码的产生量也是惊人的,因为我们不仅需要从数据库中取得数据,还需要使之可视化。
好在, ASP.Net 提供了三个数据控件,使得原本在 ASP 中繁杂的工作变得简单。这三个控件属于数据 Web 控件,分别是 DataGrid , DataList 和 Repeater 。如果你对 ASP.Net 数据库编程有所了解的话,你至少应该有使用其中一种控件的经验。大多数情况下,我们从学习使用 DataGrid 开始,因为它的功能相对完整(数据显示、分页、编辑)并相对简单。然而, DataGrid 并非总是正确的选择。
本文将分别论述每个数据控件不同于其它数据控件的特点,以及由此带来的优缺点。正因为每种数据控件都有其自身的缺陷,因此在程序设计中并不存在最完美的选择。你必须权衡三种控件的优缺点并决定哪一种更加适合你的程序。
为了帮助比较,在对每个控件进行论述时,我们会专注于三个特性:可用性(从页面访问者的角度)、开发时间和性能。我们首先描述一下这三种控件的共性,然后分别深入地讨论三种控件的特点,每种控件如何实现以及如何体现可用性、开发时间和性能。
[数据控件 (Data Web Controls) 的共同点]
在我们讨论三种控件各自特性之前,有必要先看一看它们之间的共同点。一般来说,从编程流程来看,最显著的共同点就是,这三种控件都是用来显示数据的。另一个共同点是需要一个数据绑定的代码来将数据与控件绑定。这个过程只需要两行代码:
dataWebControlID.DataSource = someDataSource
dataWebControlID.DataBind()
一般情况下, someDataSource 对象是指数据控件的数据源属性,可以是 DataSet , SqlDataReader , OleDbDataReader 或一组数据(如数组、数组列表或其它的属于 System.Collection 名空间的类)。不过,任意实现 IEnumerable 接口的对象也可以被绑定在数据控件上。
DataBind() 方法遍历一个特定的 DataSource 中的记录,并对其中的每条记录,建立一个条目并对应数据控件的 Item 集。数据控件中的每个条目将成为一个类的实例。这个类因数据控件的不同而有所区别。例如, DataGrid 中的每个条目是 DataGridItem 类的一个实例,而 Repeater 中的条目则是 RepeaterItem 类的一个实例。
之所以使用不同的类来实例化不同数据控件的条目,是因为不同的数据控件将会使用不同的方式显示数据及相应的 HTML 代码。例如, DataGridItem 类继承自 TableRow 类,也就是说,每个 DataGridItem 的实例或多或少地可以看成一个表格中的一行。这是因为 DataGrid 被设计成可以借助 HTML 中的
1<table> 标签以表格的形式显示数据,因此每条记录就是一个表格行。而 Repeater 则被设计成可以自由定义数据输出的方式。所以, RepeaterItem 并不继承自 TableRow 就不奇怪了。
2
3另一个三种数据控件的相同点是每种控件都被允许使用模板来显示数据。 DataList 和 Repeater 控件必须使用模板来输出数据,而 DataGrid 则允许通过 TemplateColumn 而只使用模板来显示一列(在 DataGrod 单元中详细论述)。
4
5另一个不是十分值得比较的地方是: DataGrid 和 DataList 都是继承自 WebControl 类,而 Repeater 则是继承自 Control 类。 WebControl 类包含一些用于美化的属性,如: BackColor 、 ForeColor 、 CssClass 、 BorderStyle 等等。这说明在使用 DataGrid 或 DataList 时,你可以设定这些属性来个性化输出。 Repeater 控件则不具有这些属性。我们会在 Repeater 单元讨论如何使用模板来美化 Repeater 的输出。</table>