关于何种情况下使用DataGrid、DataList或Repeater的一些讨论

作者: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控件,分别是DataGridDataListRepeater。如果你对ASP.Net数据库编程有所了解的话,你至少应该有使用其中一种控件的经验。大多数情况下,我们从学习使用DataGrid开始,因为它的功能相对完整(数据显示、分页、编辑)并相对简单。然而,DataGrid并非总是正确的选择。

  本文将分别论述每个数据控件不同于其它数据控件的特点,以及由此带来的优缺点。正因为每种数据控件都有其自身的缺陷,因此在程序设计中并不存在最完美的选择。你必须权衡三种控件的优缺点并决定哪一种更加适合你的程序。

  为了帮助比较,在对每个控件进行论述时,我们会专注于三个特性:可用性(从页面访问者的角度)、开发时间和性能。我们首先描述一下这三种控件的共性,然后分别深入地讨论三种控件的特点,每种控件如何实现以及如何体现可用性、开发时间和性能。

 

[数据控件(Data Web Controls)的共同点]

 

  在我们讨论三种控件各自特性之前,有必要先看一看它们之间的共同点。一般来说,从编程流程来看,最显著的共同点就是,这三种控件都是用来显示数据的。另一个共同点是需要一个数据绑定的代码来将数据与控件绑定。这个过程只需要两行代码:

  

  dataWebControlID.DataSource = someDataSource

  dataWebControlID.DataBind()

  

  一般情况下,someDataSource对象是指数据控件的数据源属性,可以是DataSetSqlDataReaderOleDbDataReader或一组数据(如数组、数组列表或其它的属于System.Collection名空间的类)。不过,任意实现IEnumerable接口的对象也可以被绑定在数据控件上。

  DataBind()方法遍历一个特定的DataSource中的记录,并对其中的每条记录,建立一个条目并对应数据控件的Item集。数据控件中的每个条目将成为一个类的实例。这个类因数据控件的不同而有所区别。例如,DataGrid中的每个条目是DataGridItem类的一个实例,而Repeater中的条目则是RepeaterItem类的一个实例。

  之所以使用不同的类来实例化不同数据控件的条目,是因为不同的数据控件将会使用不同的方式显示数据及相应的HTML代码。例如,DataGridItem类继承自TableRow类,也就是说,每个DataGridItem的实例或多或少地可以看成一个表格中的一行。这是因为DataGrid被设计成可以借助HTML中的<table>标签以表格的形式显示数据,因此每条记录就是一个表格行。而Repeater则被设计成可以自由定义数据输出的方式。所以,RepeaterItem并不继承自TableRow就不奇怪了。

  另一个三种数据控件的相同点是每种控件都被允许使用模板来显示数据。DataListRepeater控件必须使用模板来输出数据,而DataGrid则允许通过TemplateColumn而只使用模板来显示一列(在DataGrod单元中详细论述)。

  另一个不是十分值得比较的地方是:DataGridDataList都是继承自WebControl类,而Repeater则是继承自Control类。WebControl类包含一些用于美化的属性,如:BackColorForeColorCssClassBorderStyle等等。这说明在使用DataGridDataList时,你可以设定这些属性来个性化输出。Repeater控件则不具有这些属性。我们会在Repeater单元讨论如何使用模板来美化Repeater的输出。

DataList控件

 

  如前所述,DataGrid使用表格来显示数据。你也许需要更进一步地控制数据的显示。例如,你想使数据在表格中显示,但不是每行只有一条记录,而是多条。又或者,你并不想使用表格来显示数据,而是只将它们显示在一系列<span>标签中。

  DataList放弃了DataGrid中列表显示数据的概念,而是使用事先定义好的模板(Template)来定制显示。通过使用模板,可以同时使用HTML标签或数据绑定。这里的数据绑定的形式为:<%# … %>,用来显示数据源中给定条目的数据记录。如下的ItemTemplate将会显示数据源中CompanyName字段:

 

  <asp:DataList runat="server" id="myDataList">

    <ItemTemplate>

      <%# DataBinder.Eval(Container.DataItem, "CompanyName") %>

    </ItemTemplate>

  </asp:DataList

 

  通过修改上面的模板我们可以使CompanyName字段显示为粗体字ContactName字段则以正常式样显示在CompanyName之下。

 

  <asp:DataList runat="server" id="myDataList">

    <ItemTemplate>

      <b><%# DataBinder.Eval(Container.DataItem, "CompanyName") %></b>

      <br />

      <%# DataBinder.Eval(Container.DataItem, "ContactName") %>

    </ItemTemplate>

  </asp:DataList>

 

  对于DataList数据源中的每一条记录,ItemTemplate会通过定义HTML标签来以相同的样式显示数据。ItemTemplate还支持其它其它6种模板:

  ·AlternatingItemTemplate

  ·EditItemTemplate

  ·FooterTemplate

  ·HeaderTemplate

  ·ItemTemplate

  ·SelectedItemTemplate

  ·SeparatorTemplate

  默认情况下DataList会将记录显示在HTML表格中。然而,通过设定RepeatColumn属性,你可以设置在一行中显示多少条记录。更进一步,你甚至可以指定DatList的内容不显示在表格中,而是<span>标签中。这可以通过设定RepearLayout属性来实现。

  通过模板、RepeatColumnRepeatLayout属性,很明显DataList在定制数据输出样式方面较DataGrid更具灵活性,使得用户界面设计可以更加友好。当然,我们还需要进行功能性的对比,如分页、排序、记录编辑等等。

  通过EditItemIndex模板和EditCommandUpdateCommand以及CancelCommand事件,DataList将支持记录编辑的功能。不过,比较DataGrid而言,这需要耗费更多的开发时间来实现。这种开发时间上的不一致主要有两个原因:

  ·编辑/更新/删除按钮在DataGrid中可以通过设定EditCommandColumn来自动添加;而在DataList中则需要手动添加。

  ·DataGridBoundColumn列样式自动使用文本框控件来显示记录编辑界面。而在DataList你必须通过EditItemTemplate明确地指定使用什么样的编辑界面。

  实现DataList中的分页、排序功能同记录编辑功能情况一样,并不算非常复杂。这些功能可以通过巧妙的编程加以实现,只是耗费一些开发时间。所以,如果需要用户对数据记录进行排序或编辑的话,使用DataGrid要比使用DataList方便得多。

  DataList的性能要比DataGrid好一些,特别是当DataList被包含在Form当中时。图2显示了WASTDataList的测试。

 

 

2DataList的每秒请求次数

 

  可以看出在被Web Form包含的情况下DataList的性能要明显好于DataGrid

Repeater控件

 

  Repeater控件是三种数据控件中在HTML输出方面最为灵活的控件。Repeater会按照你所要求的样式严格地输出数据记录。所以,如果你不想以表格方式或者简单的<span>输出数据,那么最好使用Repeater

  与DataList一样,Repeater使用模板来指定输出样式。Repeater支持如下五种模板

  ·AlternatingItemTemplate

  ·FooterTemplate

  ·HeaderTemplate

  ·ItemTemplate

  ·SeparatorTemplate

  HederTemplateFooterTemplate指定在真正的记录输出之前或之后应处理的HTML内容。AlternatingItemTemplateItemTemplate则指定实际的每条输出记录的HTML样式。如,你需要绑定一个包含雇员信息的DataSet到一个Repeater,字段名为EmployeeName。如果你想在页面中不排序地显示这些记录,你可以使用如下的语句:

 

  <asp:Repeater runat="server" id="rptEmployees">

    <HeaderTemplate>

      <ul>

    </HeaderTemplate>

    <ItemTemplate>

      <li><%# DataBinder.Eval(Container.DataItem, "EmployeeName") %></li>

    </ItemTemplate>

    <FooterTemplate>

      </ul>

    </FooterTemplate>

  </asp:Repeater>

 

  Repeater类不是继承自WebControl类的,这一点与DataGridDataList不同。所以,Repeater没有样式方面的属性可供设定。也就是说,如果你想格式化输出Repeater的数据记录,你必须使用HTML标签来设定样式。如,在一例中,如果我们想将雇员名字显示成粗体,我们必须在ItemTemplate设置相应的HTML标签:

 

  <ItemTemplate>

    <li><b><%# DataBinder.Eval(Container.DataItem, "EmployeeName")%></b></li>

  </ItemTemplate>

 

  而如果使用DataGridDataList,我们只通过设定ItemStyle-Font-Bold属性为True即可实现。

  Repeater在格式化设定上的欠缺,直接反映到开发时间的延长上来。对输出数据样式上的越多要求,就越会导致开发周期的延长。这些在模板中规定样式的HTML标签也越发得显得混乱,而且,在将来页面更改时会更加困难,特别是当一个新的开发人员接替工作时。而使用DataGridDataList你尽可以只设定样式属性,而不使用模板。而且,如果使用Visual Studio.NetASP.Net Web Matrix工作时,这些属性更可以被直接设定而无需编码。

  因为Repeater开发时间的延长,其在内建功能(分页、排序及编辑)上的支持也显得不足。因此在可用性方面,Repeater有着明显的缺陷。当然,<b>如果</b>用户对于如何显示数据无所谓的话,这也算不了什么大问题。我之所以强调这个“如果”,是因为尽管用户有时在设计时并不要求能够分页、排序或编辑记录,但这样的要求往往会在开发后期,或在他们能看到显示出来的记录后产生。

  Repeater唯一优于DataGridDataList的特点是它的性能,尤其明显优于DataGrid。图3说明了这一点。

 

 

3:对Repeater的每秒请求次数

 

[结论]

 

  在ASP.Net页面上显示数据时,多数的程序员会选择他们所熟悉的控件来使用,特别是DataGrid。然而,这样盲目的选择在没有“最好的通用控件”的情况下是不明智的。在选择控件来显示数据前,不妨问自己几个问题来帮助决策:是否允许用户对记录排序?是不是记录需要显示在非表格的情况下?页面是否会被高频度地访问,因此应多考虑性能?

  DataGrid提供了最多的功能,如允许访问者对记录编辑、排序或分页。同时它也是最容易使用的,甚至于简单到只需要将之添加到页面中而不必额外编写代码。不过这些易用性是以性能的损失为代价的。DataGrid在三种控件中是效率最低的,特别是在使用Web Form的情况下。

  通过使用模板,DataList提供了比DataGrid更加优秀的界面效果。不过这需要以牺牲一定的开发时间为代价。为了添加排序、分页和编辑功能,程序员不得不花费比使用DataGrid更多的精力来进行编码,虽然它的性能要优于DataGrid

  最后,Repeater允许对数据记录作最大限度的HTML定制。通常,使用Repeater来显示数据记录比使用DataGridDataList要耗费更长的开发时间。另外,它不支持内建的编辑、排序和分页功能。所幸的是,Repeater在性能上要优于其它两种控件,特别是明显优于DataGrid

 

[附录]

 

WAST测试设定

  测试是在运行Microsoft Windows 2003 Server操作系统的笔记本电脑上完成的。基本配置如下:Intel P4 2.4G CPU512 MB RAM30GB Ultra ATA Hard drive;网页服务器使用IIS 6.0ASP.Net版本为1.1。此测试中的WAST被设置成使用单线程,每个测试时间为一分钟。

  测试代码http://download.microsoft.com/download/9/e/9/9e97b2f8-b317-4751-9ac1-2e34eebec26a/DataControlsPerfTest_Setup.msi点击此处下载

 

posted on 2005-12-19 10:28  Peter.zhou  阅读(163)  评论(0)    收藏  举报

导航