创建可排序的 DataGrid
创建可分页的 DataGrid
创建可排序、可分页的 DataGrid
小结
简介
Microsoft? ASP.NET 最大的用处之一就是能够在 Web页中方便地显示数据。ASP.NET 包含三个数据 Web 控件(DataGrid、DataList 和 Repeater),每个控件都是为丰富数据而设计的。 在这三个数据 Web 控件中,最常用的是 DataGrid,这主要是由于它有方便的内置功能集。具体来说,只要设置几个属性并创建两个事件处理程序, DataGrid 就可以提供排序、分页或编辑支持。有关这三个数据 Web 控件之间的区别,以及何时选择哪个控件的详细信息, 请务必阅读 Deciding When to Use the DataGrid, DataList or Repeater。
尽管创建可排序或可分页的 DataGrid 非常简单,但是要创建既可分页又可排序的 DataGrid 就比较困难了。在本文中,我们先来看看如何创建可排序和可分页的 DataGrid, 然后再讨论将这两个功能结合到一个 DataGrid 所必需的步骤。前两节内容将探讨如何向 DataGrid Web 控件添加排序功能和分页功能;如果您已经精通这一领域, 请直接跳到最后一节,该节将探讨如何将这两种功能结合到一个 DataGrid 中。
返回页首
创建可排序的 DataGrid
在开始创建可排序的 DataGrid 之前,首先需要一个只显示某些数据的 DataGrid。为了实现本文的目的, 让我们创建一个简单的 DataGrid,让它显示 Northwind 数据库中 Products 表的内容。
注 Northwind 数据库是随 Microsoft 数据库产品(如 Microsoft SQL Server(TM) 和 Microsoft Access)附带的一个标准数据库。
接下来,新建一个名为 SortableDataGrid.aspx 的 ASP.NET Web 页,然后开始添加一个 DataGrid,并将其 ID 属性设置为dgProducts。接着,将 AutoGenerateColumns 属性设置为 False,并对该 DataGrid 进行配置,使其使用三个 BoundColumn 来显示 ProductName、 UnitPrice 和 UnitsInStock 字段。剩下的唯一操作就是查询数据库并将查询结果与该 DataGrid 绑定。下面的代码显示了 Page Load 事件处理程序和一个自定义方法 BindData(),为了使一切运行正常,应当将这些代码添加到代码隐藏类中。
private void Page_Load(object sender, System.EventArgs e)
{
BindData();
}
private void BindData()
{
// Connect to the Database
SqlConnection myConnection = new SqlConnection(
connection string
);
// Retrieve the SQL query results and bind it to the Repeater
string SQL_QUERY = "SELECT ProductName, UnitPrice, UnitsInStock " +
"FROM Products";
SqlCommand myCommand = new SqlCommand(SQL_QUERY, myConnection);
myConnection.Open();
dgProducts.DataSource = myCommand.ExecuteReader();
dgProducts.DataBind();
myConnection.Close();
}
请注意,为了使这些代码能够正常工作,您需要在代码隐藏类中导入 System.Data.SqlClient命名空间,还必须将 SqlConnection 构造函数中的连接字符串更改为您的数据库的连接字符串。输入该代码之后,构建解决方案,然后通过 Web 浏览器访问该 Web 页,对它进行测试。图 1显示了 SortableDataGrid.aspx 的屏幕快照(当然,您可以使用 Microsoft Visual Studio? .NET 中的“自动套用格式”工具,使 DataGrid 的外观更吸引人。)
图 1. 通过浏览器查看的 SortableDataGrid.aspx
要使 SortableDataGrid.aspx 中的 DataGrid 可排序,首先将 DataGrid 的 AllowSorting 属性设置为 True。将此属性设置为 True 时,DataGrid 会以 LinkButton 来呈现每一列的标题,其效果是将每一列的标题呈现为超级链接。最终用户只需单击相应列标题的超级链接,即可指定要按哪一列对 DataGrid 结果进行排序。
单击列标题的超级链接时,将会回发 ASP.NET Web 页,并且激发 DataGrid 的 SortCommand 事件。作为该 ASP.NET Web 页的开发人员,我们负责为 DataGrid 的 SortCommand 事件创建一个事件处理程序,并将 DataGrid 的 SortCommand 事件与这个创建的事件处理程序进行紧密联系。该事件处理程序负责确定最终用户要按哪一列对数据进行排序,然后对基础数据重新排序,并将它与 DataGrid 重新绑定。
在编写 SortCommand 事件处理程序的代码之前,我们必须首先添加该事件处理程序。使用诸如 Visual Studio .NET 之类的工具会使该步骤大为简化。只需在“设计器”中单击 dgProducts DataGrid 即可编辑它的属性。接着,单击“属性”窗格顶部的“闪电”图标,以便查看该 DataGrid 的事件。滚动浏览至SortCommand 事件,然后输入要与该事件相关联的事件处理程序的名称,Visual Studio .NET 将完成其余任务!图 2 显示“属性”窗格中的事件列表。
图 2. 为 DataGrid 的 SortCommand 事件创建事件处理程序
如图 2 所示,我已经决定将此事件处理程序命名为dgProducts_Sort,只要使用任何合法的函数名就足够了。一旦在适当的事件文本框中输入某个事件处理程序的名称,Visual Studio .NET 就会自动在代码隐藏类中创建该事件处理程序的函数外壳,并将该事件与事件处理程序相联系。
如果您使用的不是 Visual Studio .NET,则将需要手动执行以下两个步骤。首先创建该事件处理程序的外壳,如下所示:
private void dgProducts _Sort(object source,
DataGridSortCommandEventArgs e)
{
// we'll add the code here in a bit!
}
接着,将 DataGrid 的 SortCommand 事件与该事件处理程序进行紧密联系,这可通过以下两种方法之一来完成:
• 在 DataGrid 的声明中添加 OnSortCommand="dgProducts_Sort"(即,将它添加到 HTML 部分中的 <asp:DataGrid> 开始标记内部)
• 在代码隐藏类中的 InitializeComponent() 方法中,以编程方式将 DataGrid 的事件分配给该事件处理程序。在 C# 中,这可通过以下语法来完成: dgProducts.SortCommand += new DataGridSortCommandEventHandler(dgProducts_Sort);
如果使用的是 Microsoft Visual Studio? .NET,则语法如下所示:
AddHandler dgProducts.SortCommand, AddressOf dgProducts_Sort
在创建该事件处理程序并将其与 DataGrid 的 SortCommand 事件相联系之后,就可以开始添加该事件处理程序的代码了。实质上,我们需要确定最终用户要按哪一列对结果进行排序,并重新查询数据库, 以便按照所需的顺序重新检索结果。通过检查传递到 dgProducts_Sort 事件处理程序中的DataGridSortCommandEventArgs 参数的 SortExpression 属性,可以确定在最终用户单击之后导致回发的列。
请注意,每个 DataGrid 列都有一个与之相关的 SortExpression 值。当 DataGrid 的 AutoGenerateColumns 属性设置为 True 时,会为每一列自动分配一个 SortExpression 值, 此值等于该列所显示的 DataSource 字段的名称。当 AutoGenerateColumns 设置为 False 时,必须显式指定 SortExpression 属性的值。如果没有为某个特定列设置 SortExpression 属性,则该列的标题将不显示为超级链接;因此,最终用户将无法按这一特定的列对 DataGrid 进行排序。为了证明这一点,请仅设置前两个 BoundColumn 列的 SortExpression 属性。尽管可以将SortExpression 属性设置为任何值,但是请将前两个 BoundColumn 的SortExpression 均设置为与 DataField 属性相同的值。这样一来,DataGrid 声明应当如下所示:
<asp:DataGrid >
小结
创建可分页或可排序的 DataGrid 相对来说比较简单。但是,要将这两个方面组合到一个 DataGrid 中就需要一点技巧, 因为在对数据进行分页浏览时,我们需要记住 DataGrid 在排序时所依据的列。正如本文所提到的那样,我们可以利用 ViewState 来帮助记住 DataGrid 在排序时所依据的 DataSource 字段。 尽管本文将重点放在使用默认分页上,但是其技术同样适用于自定义分页。
如果您对本文内容、所讨论的技术或者所讨论的代码示例有疑问,欢迎您给我发电子邮件,我的联系地址是 mitchell@4guysfromrolla.com 。
祝您编程愉快!
推荐的链接
• DataGrid Web 控件的进一步探讨:第 15 部分 : Adding Default Paging Support to a DataGrid
• DataGrid Web 控件的进一步探讨: 第 4 部分:Creating a Sortable DataGrid
• ASP.NET 论坛中的The DataGrid, DataList, and Repeater Forum