DataGrid 第二个缺点是它的性能。 DataGrid 是这三个数据 Web 控件中性能最差的。 基于这一点,由 DataGrid - 特别是具有许多行的 DataGrids - 产生的 ViewState 可能会非常大。 如果使用 DataGrid 仅仅是为了显示数据,则可以关闭 ViewState,但是,使用 DataGrid 的排序、分页或编辑功能时,就不能这样做了。
为了测试 DataGrid 的性能,我使用了 Microsoft 的免费 Web Application Stress Tool (WAST)。 在本文最后的"基准设置"一节中列出了精确的测试条件和 WAST 设置。 另外,测试使用的代码也可在本文最后下载。
这个 Web Application Stress Tool 会向 Web 服务器发出一组特定的 URL 请求。 对于每一项测试,我都在一分钟之内尽可能快地不断请求一个 URL。 WAST 报告了许多性能衡量标准;我要关注的一个衡量标准是每秒请求数,它表明了 Web 服务器每秒能执行多少次 ASP.NET Web 页面。
对于一个仅显示数据的简单 DataGrid,运行了两个测试。 具体地说,DataGrid 显示了来自 Northwinds 数据库的 Customers 表(Customers 表总共包含 91 条记录)的四个字段。 DataGrid 的 AutoGenerateColumns 属性设置为 True。 第一项测试把 DataGrid 放在一个 Web 窗体( <form runat="server">)中,而第二项测试则没有。 如果在窗体中放置一个控件而不把它的 EnableViewState 属性显式设置为 False,那么该控件则会用 ViewState 保持它的状态。 创建这个 ViewState 项可能是一个比较费时的过程,因此减少了可处理的总的每秒请求数,结果如图 1 所示。
正如我们将要在研究 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:DataList runat="server" id="myDataList"> <ItemTemplate> <%# DataBinder.Eval(Container.DataItem, "CompanyName") %> </ItemTemplate></asp:DataList>
除了数据绑定语法,模板也可以包含 HTML 标记。 通过更新上面的模板,可以使 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 的 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 中,以及DataGrid BoundColumn 列类型自动使用 TextBox Web 控件作为编辑接口,而使用 DataList 时必须通过 EditItemTemplate 为要编辑的项显式指定的编辑接口。

