作者:scott mitchell
[概述]
web开发自从有了基于脚本的web编程技术(如asp)以来,经历了一个漫长的过程。通过使用微软的asp.net技术,传统的asp中大量的、单调乏味的、重复性的编程工作成为了历史。例如,象大多数asp程序员所知的,在asp中显示数据库内容所需要的过程:
建立数据库连接
用sql查询装载ado数据集
显示所需要的任何html代码
遍历数据集中的记录
输出记录字段值及相关的html
移向下一条记录
循环
显示所需要的html代码
又如,为了在表格中显示记录集的内容,我们需要输出一个<table>标签,然后开始循环。在循环中,每输出一条记录,需要先输出一个<tr>标签以及若干对<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中的<table>标签以表格的形式显示数据,因此每条记录就是一个表格行。而repeater则被设计成可以自由定义数据输出的方式。所以,repeateritem并不继承自tablerow就不奇怪了。
另一个三种数据控件的相同点是每种控件都被允许使用模板来显示数据。datalist和repeater控件必须使用模板来输出数据,而datagrid则允许通过templatecolumn而只使用模板来显示一列(在datagrod单元中详细论述)。
另一个不是十分值得比较的地方是:datagrid和datalist都是继承自webcontrol类,而repeater则是继承自control类。webcontrol类包含一些用于美化的属性,如:backcolor、forecolor、cssclass、borderstyle等等。这说明在使用datagrid或datalist时,你可以设定这些属性来个性化输出。repeater控件则不具有这些属性。我们会在repeater单元讨论如何使用模板来美化repeater的输出。