DataGrid Web控件运作机制探秘
DataGrid Web控件是三个ASP.NET数据Web控件中功能最多的。正如前文所述,DataGrid Web控件从WebControl类中诞生,因此可以指定自己想要的样式。但是在自定义控件生成的实际 HTML 标记时,它又是最不灵活的。 呈现的 HTML 标记中的这种不灵活性,是由于 DataGrid 是设计用于使用 HTML< table>以表格形式显示数据所造成的。 因此,对于每一条绑定到 DataGrid 的记录,都会创建一个单独的表行( < tr>),对于要显示的记录中的每一个字段,都会创建一个单独的表列( < td>)。
DataGrid Web控件提供了许多功能,可极大地提高要显示的数据的可用性。 例如,把 DataGrid 的AllowSorting属性设置为 True 并添加一点源代码,开发人员就可以把一个普通的 DataGrid 变成一个其数据可以由最终用户排序的 DataGrid。 另外,再增加一点工作量,开发人员就能增强 DataGrid 的功能以允许数据分页或数据的内联编辑。 这些功能明显增强了 DataGrid 的可用性。
除了在可用性方面得分很高,DataGrid 还提供了很短的开发时间。 要使用 DataGrid 开始在 ASP.NET Web 页面中显示数据,只需要把 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 列类型。
有了这么多的 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 的免费 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 所示。