决定何时使用 DataGrid、DataList 或 Repeater(ASP.NET 技术文章)_asp.net教程-查字典教程网
决定何时使用 DataGrid、DataList 或 Repeater(ASP.NET 技术文章)
决定何时使用 DataGrid、DataList 或 Repeater(ASP.NET 技术文章)
发布时间:2016-12-29 来源:查字典编辑
摘要:摘要:了解ASP.NET用于显示数据的三个控件:DataGrid、DataList和Repeater。这些控件中的每一个都有独特的特性以及相...

摘要:了解ASP.NET用于显示数据的三个控件:DataGrid、DataList和Repeater。这些控件中的每一个都有独特的特性以及相关的优点和缺点。创建显示数据的ASP.NET应用程序时,为这项工作选择正确的控件非常重要。正如将在本文中所看到的一样,选择使用DataGrid、DataList还是Repeater,要权衡下面三个因素:可用性、开发时间和性能。(12页打印页)

简介

自从出现了像MicrosoftActiveServerPages(ASP)这样的简单且基于脚本的Web编程技术以来,Web开发又有了很大的发展。传统ASP中常见的大量枯燥、重复的编码工作,在MicrosoftASP.NET中不复存在了。例如,正如所有传统ASP开发人员一度都知道的那样,在传统ASPWeb页面中显示数据需要下面的伪代码:

Createconnectiontothedatabase

PopulateanADORecordsetwithaSQLquery

DisplayanyheaderHTMLneeded

ForEachRecordintheRecordset

PrintouttheRecordsetfield(s)andassociatedHTML

Movetothenextrecord

Next

DisplayanyfooterHTMLneeded

例如,要在HTML<table>中显示记录集的内容,开发人员则不得不为<table>标记(tag)生成HTML标记(markup),然后循环遍历记录集中的每一条记录,每次循环生成一个<tr>标记,以及许多<td>标记和要显示的记录集字段的值。最后,在循环之后,开发人员需要生成结束<table>标记。

传统ASP所要求的这种方法有一个很大的缺点:它把HTML内容和ASPWeb页面的源代码紧密集成在一起。因为没有分离代码和HTML内容,所以更改HTML的内容及其困难,尤其是对不懂编程技术的图形艺术家或Web设计者来说更是如此。而且,因为检索数据库结果和生成它的内容都需要代码,所以代码和HTML内容的这种集成相对来说需要大量的代码。

幸好,ASP.NET提供了三个控件,使得在ASP.NETWeb页面中显示数据绝对比传统ASP所需的迭代方式简单得多。这三个控件是DataGrid、DataList和Repeater,以后我将称之为数据Web控件。也许,如果您已经开发过ASP.NETWeb页面,那么至少会对这三个控件中的一个有一些经验。通常,开发人员从学习DataGrid开始,这是因为DataGrid使用简单以及它具有允许数据排序、分页和编辑的功能。但是,在ASP.NETWeb页面中显示数据时,DataGrid并不总是控件的最佳选择。

在本文中,我们将研究这些数据Web控件中每个控件的独特特性。这些特性赋予每个数据Web控件许多优点和缺点。因为每一个数据Web控件都有一些缺点,所以没有可用于任何作业的“完美”控件。决定使用哪个控件时,必须权衡这三个数据Web控件每一个的优点和缺点,然后再决定哪个控件是最合适的。

为了协助进行比较,研究每一个数据Web控件时,我们将着重于这三个衡量标准:可用性(从Web访问者的角度)、开发时间和性能。我们首先快速浏览一下这三个数据Web控件之间的相似性。接下来我们将深入研究DataGrid,然后研究DataList,最后查看Repeater。对于每一个控件,我们将研究这些控件的功能,并讨论它的功能集是如何影响这些衡量标准的。

返回页首

数据Web控件之间的相似性

在研究数据Web控件之间的差异(这些差异使它们区别于其他控件)之前,先看一下它们的相似性。从较高级别观点来看,最基本的相似性是,DataGrid、DataList和Repeater都设计为了执行大致相同的操作:显示数据。另一个相似性把数据绑定到数据Web控件所需的代码。具体地说,只需要下面两行代码:

dataWebControlID.DataSource=someDataSource

dataWebControlID.DataBind()

通常,赋给数据Web控件的DataSource属性的someDataSource对象是一个DataSet、SqlDataReader、OleDbDataReader或一个集合(如Array、ArrayList或System.Collections命名空间中的其他某个类)。但是,任何实现IEnumerable接口的对象都可以绑定到数据Web控件。

DataBind()方法枚举指定的DataSource中的记录。对于DataSource中的每一条记录,都会创建一个项并追加到数据Web控件的Items集合中。数据Web控件中的每一项都是一个类实例。用于控件每一项的特定类取决于该数据Web控件。例如,DataGrid中的每一项都是DataGridItem类的一个实例,而Repeater中的每一项都是RepeaterItem类的一个实例。

每个数据Web控件会为它的每一项使用不同的类,因为是这些项呈现的方式决定了数据Web控件生成的HTML标记。例如,DataGridItem类是从TableRow类中派生的,这意味着每个DataGridItem都或多或少地呈现为一个表行。这很有意义,因为DataGrid设计为在HTML<table>标记内以表格形式显示数据,在HTML<table>中,每一项都呈现为单独一行。另一方面,Repeater设计为允许对它的输出进行完全自定义。因此,RepeaterItem类不从TableRow类中派生并不令人惊讶。

数据Web控件之间的另一个相似性是每个控件都能使用模板提供高度自定义的输出。DataList和Repeater控件必须使用模板指定它们的内容,而DataGrid则通过TemplateColumn列类型可以为特定的列选择使用模板(我们将在下一节“研究DataGridWeb控件”中讨论各种不同的DataGrid列类型)。

最后一个值得注意的是DataGrid和DataList控件是从WebControl类中派生的,而Repeater控件是从Control类中派生的。WebControl类包含许多美学方面的属性,例如BackColor、ForeColor、CssClass、BorderStyle等。这意味着如果使用DataGrid和DataList,就可以通过它们从WebControl类中继承的属性指定样式设置。而Repeater没有任何这样的样式属性。正如我们将在“深入研究Repeater”一节中所讨论的一样,对Repeater输出的任何可视设置都必须在Repeater的模板中指定。

返回页首

研究DataGridWeb控件

DataGridWeb控件是这三个数据Web控件中功能最多的,但是在自定义控件生成的实际HTML标记时,它又是最不灵活的。呈现的HTML标记中的这种不灵活性,是由于DataGrid是设计用于使用HTML<table>以表格形式显示数据所造成的。因此,对于每一条绑定到DataGrid的记录,都会创建一个单独的表行(<tr>),对于要显示的记录中的每一个字段,都会创建一个单独的表列(<td>)。

DataGrid提供了许多功能,可极大地提高要显示的数据的可用性。例如,把DataGrid的AllowSorting属性设置为True并添加一点源代码,开发人员就可以把一个普通的DataGrid变成一个其数据可以由最终用户排序的DataGrid。另外,再增加一点工作量,开发人员就能增强DataGrid的功能以允许数据分页或数据的内联编辑。这些功能明显增强了DataGrid的可用性。

除了在可用性方面得分很高,DataGrid还提供了很短的开发时间。要使用DataGrid开始在ASP.NETWeb页面中显示数据,只需要把DataGrid添加到Web页面中并编写两行必要的代码:第一行把数据绑定到DataGrid的DataSource,第二行调用DataGrid的DataBind()方法。显然,随着添加到DataGrid中的功能数量的增加,开发时间也增加了,但这只是把开发时间和其他数据Web控件进行比较。假设您要允许对Repeater显示的数据进行排序。添加这样的功能是一定可能的,但是与用DataGrid完成同样的操作相比,这需要明显多很多的时间和精力。

尽管DataGrid具有良好的可用性和开发时间得分,但是这个控件有两个固有的缺点。第一,正如前面所谈到的,DataGrid在对所呈现的HTML标记进行自定义方面的功能很有限。是的,您可以自定义DataGrid的不同行和列的字体、颜色和边框,但是事实仍然是,当DataGrid显示数据时,结果将是一个HTML<table>,DataSource中的每一条记录都对应其中一个<tr>,每一个字段都对应其中一个<td>。

具体地说,DataGrid中的每一列都是一个从DataGridColumn类中派生的类实例。有五个内置的DataGrid列类型:

•BoundColumn

•ButtonColumn

•EditColumn

•HyperLinkColumn

•TemplateColumn

每一个列类型都提供数据或提供某种允许用户和DataGrid进行交互的接口。例如,BoundColumn以纯文本显示DataSource字段的值,而HyperLinkColumn则会显示一个超级链接,其文字和URL部分可能是DataSource字段。除了这些内置的列类型,通过创建DataGridColumn类的派生类,还可以创建自定义DataGrid列类型。(有关创建一个用于扩展BoundColumn功能以限制显示字符数的列的示例,请参阅CreatingaCustomDataGridColumnClass。)

有了这么多的DataGrid列类型,可能就不理解为什么DataGrid呈现的HTML标记不能进行高度自定义了。要知道,虽然每一个DataGrid列类型在呈现时生成不同的HTML,但是每一列都包含在一组<td>标记中,每一行都包含在一组<tr>标记中。因此,即使可以用TemplateColumn自定义每一行的特定列的HTML输出,而DataGrid仍然呈现为HTML<table>,其中每一行使用一个<tr>,每一列使用一个<td>。DataGrid的这种限制禁止了更多具有创造性的数据显示。例如,如果要在每一表行中显示五条记录,就不能使用DataGrid,必须使用DataList或Repeater。另外,如果要在除<table>之外的HTML标记中显示数据,很遗憾,就不能使用DataGrid了。

DataGrid第二个缺点是它的性能。DataGrid是这三个数据Web控件中性能最差的。基于这一点,由DataGrid-特别是具有许多行的DataGrids-产生的ViewState可能会非常大。如果使用DataGrid仅仅是为了显示数据,则可以关闭ViewState,但是,使用DataGrid的排序、分页或编辑功能时,就不能这样做了。

为了测试DataGrid的性能,我使用了Microsoft的免费WebApplicationStressTool(WAST)。在本文最后的“基准设置”一节中列出了精确的测试条件和WAST设置。另外,测试使用的代码也可在本文最后下载。

这个WebApplicationStressTool会向Web服务器发出一组特定的URL请求。对于每一项测试,我都在一分钟之内尽可能快地不断请求一个URL。WAST报告了许多性能衡量标准;我要关注的一个衡量标准是每秒请求数,它表明了Web服务器每秒能执行多少次ASP.NETWeb页面。

对于一个仅显示数据的简单DataGrid,运行了两个测试。具体地说,DataGrid显示了来自Northwinds数据库的Customers表(Customers表总共包含91条记录)的四个字段。DataGrid的AutoGenerateColumns属性设置为True。第一项测试把DataGrid放在一个Web窗体(<formrunat="server">)中,而第二项测试则没有。如果在窗体中放置一个控件而不把它的EnableViewState属性显式设置为False,那么该控件则会用ViewState保持它的状态。创建这个ViewState项可能是一个比较费时的过程,因此减少了可处理的总的每秒请求数,结果如图1所示。

图1:DataGrid的每秒请求数

正如我们将要在研究DataList和Repeater时看到的一样,这两个控件都提供了比DataGrid更好的性能。

返回页首

分析DataList

记得DataGrid将呈现为HTML<table>,每一个DataSource记录作为一个表行(<tr>),每一个记录字段作为一个表列(<td>)。有时,您可能想更多地控制数据的显示。例如,您可能想把数据显示在HTML<table>中,但不是每行显示一条记录,而是每行显示五条记录。或者,您根本不想把数据显示在<table>标记中,而是想把每个元素显示在一个<span>标记中。

DataList放弃了DataGrid所采用的“列”概念。相反,DataList的显示是通过模板定义的。利用模板,开发人员可以指定混合的HTML语法和数据绑定语法。HTML语法是标准的HTML标记;数据绑定语法是使用<%#和%>标记分隔的,用于从DataSource的记录中产生用于构造给定DataList项的内容。例如,下面的ItemTemplate将显示DataSource的字段CompanyName:

<asp:DataListrunat="server"id="myDataList">

<ItemTemplate>

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

</ItemTemplate>

</asp:DataList>

除了数据绑定语法,模板也可以包含HTML标记。通过更新上面的模板,可以使CompanyName字段以粗体显示,而使ContactName字段以非粗体显示在CompanyName字段的下面:

<asp:DataListrunat="server"id="myDataList">

<ItemTemplate>

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

<br/>

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

</ItemTemplate>

</asp:DataList>

对于DataList的DataSource中的每一条记录,都要计算ItemTemplate的数据绑定语法。数据绑定语法的输出与HTML标记一起指定了为DataList项呈现的HTML。DataList还支持其他六个模板,包括ItemTemplate在内共有如下七个:

•AlternatingItemTemplate

•EditItemTemplate

•FooterTemplate

•HeaderTemplate

•ItemTemplate

•SelectedItemTemplate

•SeparatorTemplate

注意,DataGrid的TemplateColumn仅支持四个模板:ItemTemplate、HeaderTemplate、FooterTemplate和EditItemTemplate。

默认情况下,DataList将每一项都显示为HTML<table>中的一行。但是,通过设置RepeatColumns属性,您可以指定表的每一行显示多少个DataList项。除了可以指定HTML<table>的每一行显示多少个DataList项之外,还可以指定DataList的内容应该使用<span>标记显示,而不是使用<table>标记。DataList的RepeatLayout属性可以设置为Table或Flow,表示DataList中的数据呈现在HTML<table>中还是<span>标记中。

利用模板以及RepeatColumns和RepeatLayout属性,很明显DataList比DataGrid允许对呈现的HTML标记进行更多的自定义。这种增强了的自定义使得使用DataList能够产生更为友好的数据显示,因为DataGrid的“每一条DataSource记录占用一个表行的单HTML<table>”模型不可能总是用于显示信息的最佳选择。但是,只研究比DataGrid改进了的自定义并不足以确定DataList的可用性;我们还必须比较DataGrid和DataList的排序、分页和编辑功能。

使用EditItemIndex模板以及EditCommand、UpdateCommand和CancelCommand事件,DataList可以支持内联编辑。但是,用DataList添加这样的功能比用DataGrid花费的开发时间要长。开发时间的差异是由于下面两个原因:

•通过EditCommandColumn列类型即可在DataGrid中创建的编辑/更新/取消按钮,必须手动添加到DataList中,以及

•DataGridBoundColumn列类型自动使用TextBoxWeb控件作为编辑接口,而使用DataList时必须通过EditItemTemplate为要编辑的项显式指定的编辑接口。

虽然用DataList进行内联编辑不是很困难,但是DataList的数据排序、分页和编辑却很困难。虽然一些灵活的编码肯定能完成这样的功能,但是向DataList中添加这样的功能将花费相当多的开发时间。因此,如果最终用户能对数据进行排序和分页是一个必需要求的话,那么最好选择DataGrid而不选择DataList。

DataList的性能比DataGrid的性能好,当DataList位于Web窗体内时这一点更明显。图2显示了WebApplicationStressTool在DataList上的测试结果。

图2:DataList的每秒请求数

正如图2中的结果显示的那样,当DataList放置在Web窗体内时(因此导致该Web控件生成它的ViewState),该Web控件要远胜于DataGrid。

返回页首

深入研究Repeater

在所有这三个数据Web控件中,RepeaterWeb控件在呈现的HTML里提供了最大的灵活性。DataGrid或DataList会在预设的HTML标记中自动包含开发人员指定的内容。与它们不同的是,Repeater在呈现的时候将严格生成指定的HTML标记。因此,如果不想用HTML<table>或者一系列<span>标记显示数据,而希望以其他方式显示数据,就必须使用Repeater控件。

就像DataList一样,使用Repeater时要用模板指定标记。Repeater包含下列五个模板:

•AlternatingItemTemplate

•FooterTemplate

•HeaderTemplate

•ItemTemplate

•SeparatorTemplate

HeaderTemplate和FooterTemplate指定出现在绑定到Repeater的数据之前和之后的HTML标记。AlternatingItemTemplate和ItemTemplate指定用于呈现Repeater的DataSource中的每条记录的HTML标记和数据绑定语法。例如,假设您要把包含雇员信息的数据集绑定到Repeater,该数据集的其中一个字段是EmployeeName。如果要在Web页上以无序列表的形式显示雇员列表,则可以使用如下Repeater语法:

<asp:Repeaterrunat="server"id="rptEmployees">

<HeaderTemplate>

<ul>

</HeaderTemplate>

<ItemTemplate>

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

</ItemTemplate>

<FooterTemplate>

</ul>

</FooterTemplate>

</asp:Repeater>

与DataGrid和DataList不同,Repeater类不是从WebControl类派生的。因此,Repeater缺少DataGrid和DataList二者共有的样式属性。这一点归结起来无非是说,如果想对Repeater中所显示数据进行格式设置,则必须在HTML标记中进行这样的操作。例如,在上面的例子中,如果想用粗体显示雇员的姓名,则必须更改ItemTemplate以包含HTML粗体标记,就像下面这样:

<ItemTemplate>

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

%></b></li>

</ItemTemplate>

然而对于DataGrid或DataList,通过把控件的ItemStyle-Font-Bold属性设置为True,就能用粗体显示文本了。

Repeater缺少样式属性会大大增加开发的时间指标。例如,假设决定使用Repeater显示数据,这些数据需要以粗体、中间对齐且带有特定背景色的特定字体显示。所有这些都要用几个HTML标记指定,这些标记很快就会使Repeater的模板变得凌乱不堪。这种凌乱会使以后对外观进行更改变得困难得多,尤其是当其他人对该项目进行操作时,则不得不查看大量HTML语法。将这一点与为DataGrid或DataList指定格式进行比较。对于这两个控件中的任何一个,都可以通过指定DataGrid或DataList的样式属性来使模板免于凌乱。此外,可以用一些工具来自动设置DataGrid和DataList的样式属性,例如MicrosoftVisualStudio.NET或ASP.NETWebMatrix。

除了延长开发时间之外,Repeater还缺少有助于支持分页、编辑或数据编辑的内置功能。由于缺少这些功能支持,Repeater在可用性的评定中得分很低。当然,如果所有您感兴趣的只是显示数据,而不用带任何别致的铃声或口哨声,那么Repeater的功能匮乏就不是主要缺点了。我之所以强调“如果”一词是因为,通常,Web应用程序一旦进行了部署,用户就会发现他们需要附加的功能,例如排序、分页和编辑。

Repeater有一个弥补性的品质(这并不令人吃惊),那就是性能。Repeater的性能比DataList的性能稍微好一点,比DataGrid的性能要好很多。图3显示了Repeater每秒能处理的请求数,并与DataGrid和DataList进行了对比。

图3:Repeater的每秒请求数

返回页首

小结

在ASP.NETWeb页面中显示数据时,很多开发人员都选择他们最熟悉的数据Web控件,通常是DataGrid。但是这样的盲目决定不够明智,因为根本没有通用的“最好的”数据Web控件。决定为给定的Web页使用哪个数据Web控件时,应该先就以下各种问题自己考虑一下,以确定哪个控件最适合手边的任务。您想允许用户对数据进行排序吗?需要把数据用非HTML<table>的格式显示吗?页面会被大量访问吗,因而性能是一个关键的问题吗?

因为DataGrid能允许最终用户排序、分页和编辑它的数据,所以这三个数据Web控件中DataGridWeb控件提供了最好的功能集。因为使用DataGrid时只需要把它添加到Web页面中并写几行代码,所以DataGrid也是最简单易用的数据Web控件。但是,容易使用和强大的功能是要付出代价的,如性能的代价:DataGrid是三个数据Web控件中效率最低的,特别是当把它放置在Web窗体中时。

通过使用模板,DataList对显示的数据外观提供了比DataGrid更多的控制。但是,使用模板通常比使用DataGrid的列类型需要更多的开发时间DataList还支持数据的内联编辑,但是实现起来需要的工作量比DataGrid多。遗憾的是,在DataList中提供分页和排序支持不是一件简单的事。DataList比DataGrid提供了更好的性能,从而弥补了这些缺少的内置功能。

最后,Repeater控件允许对呈现的HTML标记进行完整和全面的控制。对于Repeater,生成的唯一HTML是模板中数据绑定语句的值和模板中指定的HTML标记,而不会生成象DataGrid和DataList那样的“额外”HTML。由于要求开发人员指定完整生成的HTML标记,所以通常Repeater需要的开发时间最长。而且,Repeater不提供内置编辑、排序或分页支持。但是,Repeater的性能确实是这三个数据Web控件中最好的。它的性能可与DataList相比,但明显比DataGrid好。

祝大家编程愉快!

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新asp.net教程学习
    热门asp.net教程学习
    编程开发子分类