DataGrid Web控件运作机制探秘

开发 后端
DataGrid Web控件是ASP.NET中一个十分常用,也是功能最丰富的控件之一。本文介绍了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 所示。

DataGrid 的每秒请求数 

图 1: DataGrid 的每秒请求数

应该说,DataGrid Web控件的性能并不是很理想。

【编辑推荐】

  1. 小议ASP.NET数据Web控件之间的相似性
  2. 从传统ASP到ASP.NET的转变:了解控件
  3. ASP.NET调试API之Log4net使用指南
  4. 使用ASP.NET模板生成HTML静态页面的五种方案
  5. ASP.NET Login控件使用方法及须知
责任编辑:yangsai 来源: MSDN
相关推荐

2009-08-11 14:45:41

C# DataGrid

2009-08-21 15:27:11

C# DataGrid

2009-06-30 09:55:24

Spring运作机制

2023-06-07 15:25:19

Kafka版本日志

2010-08-06 14:13:31

FlexDataGrid分页控

2009-07-24 17:22:22

CLR 4.0安全模型

2012-11-07 10:06:05

路由器VPN

2009-07-09 18:15:42

JDBC事务处理

2009-08-07 17:42:43

ASP.NET Dat

2010-08-09 08:48:46

File APIWeb

2021-01-06 09:01:05

javaclass

2013-09-09 15:06:03

2010-05-11 16:22:40

2010-03-18 14:11:32

Web交换机

2010-04-16 09:06:18

WPF 4

2010-09-26 14:08:41

Java垃圾回收

2020-01-16 09:55:28

STGW流量内核

2018-06-29 14:20:05

2009-08-03 18:29:31

GridView与Da

2019-04-04 09:08:41

点赞
收藏

51CTO技术栈公众号