日期:2009-10-31  浏览次数:20574 次

首先我们将从一个示范开始,在这个示范中我将使用一个按钮点击事件排序表格中的数据。然后介绍的是一组属性——HyperlinkColumn、BottonColumn 和 BoundColumn,使用这些属性可以为 DataGrid 添加一些有趣的自定义功能。


下面我们首先从上一次结束的地方——清单A开始。下面是清单A中代码的输出。


DataGrid 的输出

要注意的第一个变化是表头中的列名现在是可点击的。自己运行一下这个示例,你会发现在点击每个字段时,数据会自动排序。

现在我们看一下引发这个变化的代码。首先我将介绍 strSortBy 变量,这个变量用于存储排序参数的名字。Page_Load() 函数也已有改动:当页面第一次被装载时,id字段被选作默认的排序参数。

下面创建 DataView 对象的一个实例,用于在运行时期改变排列顺序。只要把这个属性设置为要排序的列,DataView 就会替我们完成排序工作。

最后,使用 DataGird 控件的一些新属性将这些东西粘合到一起。AllowSorting激活排序,而 OnSortCommand属性指定在接收到一个排序请求时需要调用的事件处理器。第二个属性已经设置为dgsuperheroes_Sort(),这个函数将在我们点击头部的字段名时由 .NET 编译器自动调用。在这个函数中,SortExpression属性保存被选作排序参数的字段名,然后根据这个字段重新绑定 DataGrid,从而实现排序。



向 DataGrid 中添加链接


接着,我们可以通过以下方式改进 DataGrid 的界面:只在前面展示信息的摘要,并在 DataGrid 中插入一些超链接,然后在点击这些链接时显示详细信息。清单B 展示了如何实现这一效果,图B 展示了相应的输出:

图B

在 DataGrid 中插入超链接
这里 DataGrid 只包含两列——第一列是 ID,第二列是名字。如果点击任何一个名字,就会调出另外一个 ASP.NET 脚本,显示被选项的所有详细信息。

在这个脚本中最重要的东西是 AutoGenerateColumns 属性。该属性如果设为 false,那么就可以保证 .NET 编译器不会根据表的字段自动产生 DataGrid 的列。

很明显的问题是,然后该怎样生成列?很简单,使用 <Columns> 元素,这一元素将围起需要显示的列的定义。

第一种列是 <ASP:BoundColumn> 类型,该类型允许我们将 DataGrid 的一列绑定到数据库表的一个字段。所需的字段被赋予 <ASP:BoundColumn> 元素的 DataField属性。

然后,<ASP: HyperLinkColumn> 元素允许我们插入一个特殊列,在该列中有 DataGrid 每一行的一个链接。DataTextField属性控制列中要显示的表字段,DataNavigateFormatString属性控制超链接的 URL 目标(注意 {0} 格式用于变量填补),DataNavigateUrlField属性指定用于填补的数据库字段。

如果点击超级英雄(super hero)的名字,会进入 more.ASPx 脚本,该脚本以 id 作为一个 GET 参数传递,然后从数据库中获取信息,并将信息显示在页面上。
命令中心
前面的例子引入了一个包含超链接的列。现在,你将看到如何引入一个能够在用户点击时运行自定义命令的列。比如说,当用户点击一个列时,在页面上隐藏或者显示一个元素。



首先,在前面创建的 DataGrid 中添加两个列。第一个新列使用被选记录的详细信息填充另外一个 DataGrid(位于同一页面),而第二个列用于在用户点击一个按钮时显示或隐藏这个新的 DataGrid。

清单C是产生的代码,下图是清单以中代码的简单输出:

图C


使用 DataGrid 显示/隐藏详细信息
脚本中实际上包含两个 DataGrid:第一个是“dgsuperheroes”,用于显示超级英雄(superheroes)的名字,第二个是“dgsuperheroes_details”,用于显示被选英雄的详细信息。默认情况下,第二个 DataGrid 在页面加载时是不可见的,因为其 Visible 属性设置为 false。

现在回到“dgsuperheroes” DataGrid,你会发现我们已经把 AutoGenerateColumns 属性设置为“false”并且引入了四个自定义列:两个用于记录 ID 和名称的 <ASP:BoundColumn>,还有两个用于保存命令的 <ASP:ButtonColumn>。

每个 <ASP:ButtonColumn> 都有三个有用的属性:HeaderText,控制表头行显示的文字;Text,控制每一行显示的文字;CommandName,用于为每个命令指定一个唯一标识符。

“dgsuperheroes” DataGrid定义还引入了 OnItemCommand 属性,这个属性指定在用户点击一个 <ASP:ButtonColumn> 链接时被调用的事件处理器。在这个例子中,事件处理器叫做 SuperHero_Details(),它使用 CommandName 区分对“显示详细信息(Show Details)”和“隐藏详细信息(Hide Details)”请求的调用。注意这里显式地将事件(作为事件处理器的一个输入参数)转型为一个 LinkButton。

分享你的 DataGrid 技巧和窍门
在学习完本文的这两部分课程之后,我已经尝试尽量深入地讲解了 ASP.NET 中非常酷的 DataGrid 控件的很多东西。此外还展示了如何使用最简单的方法向 DataGrid 中添加排序列,之后我还快速地介绍了 DataGrid 控件的三个有用但有点复杂的属性:<ASP:BoundColumn> 元素,用于将 DataGrid 列绑定到数据库表的具体字段;<ASP:HyperLinkCommand> 元素,用于在 DataGrid 中插入超链接;<ASP:ButtonColumn> 元素,使得将自定义命令引入到 DataGrid 中更加容易。不妨到Discussion Board 跟大家分享你最爱的 DataGrid 技巧或窍门。