如何使用 Visual C# .NET 对 DataGrid Windows 控件执行分页

概要

DataGrid Web 控件有内置的自动或自定义分页功能,而 DataGrid Windows 控件则没有。本文演示了如何为 DataGrid Windows 控件创建简单的分页机制。

本文的代码示例利用了 DataSet 对象。在 ADO.NET 中, DataSet 对象是通过单次操作填充的并且永驻在内存中。如果您正在使用一个大型 DataSet,本文将为您介绍如何通过编程按块或页显示数据。

本示例以 Microsoft SQL Server 罗斯文数据库中的“客户”表为数据库后端。如果您连接的是其他数据库或表,请确保相应更新代码。

此方法有一定局限性。请参考 疑难解答 一节以了解详细信息。

返回页首

要求

下表列出了推荐使用的硬件、软件、网络架构以及所需的 Service Pack:
Microsoft Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server 或 Windows NT 4.0 Server
Microsoft Visual Studio .NET
Microsoft SQL Server 7.0 或更高版本
本文假定您熟悉下列主题:
Visual C# .NET
ADO.NET 基础知识和语法
返回页首

向 DataGrid Windows 控件中添加分页的步骤

当您对 DataGrid 分页时,数据会在页大小的“块”中显示,即一次显示一页记录。要效仿的这个示例代码将每页的 DataRow 对象从内存中的 DataSet 复制到一个临时表中。该临时表随后与 DataGrid 控件绑定。
1.打开一个新的 Visual C# .NET Windows 应用程序项目。
2.添加 DataGrid 控件,将其 ReadOnly 属性设置为 True
3.将下列附加控件放置在 Form1 上,并按如下所示设置它们的属性:
控件Name 属性Text 属性
ButtonbtnFirstPageFirst Page
ButtonbtnNextPageNext Page
TextBoxtxtDisplayPageNo
ButtonbtnPreviousPagePrevious Page
ButtonbtnLastPageLast Page
TextBoxtxtPageSize5
ButtonbtnFillGridFill Grid
DataGriddataGrid1

4.复制以下代码并将其粘贴到 Form1 代码窗口的顶部。确保每个命名空间只被引用一次。默认情况下,可能已经引用 SystemSystem.Data
using System;
using System.Data;
using System.Data.SqlClient;
					
5.复制以下代码并将其粘贴到公共类 Form1 的顶部,以便为 Form1 声明窗体级变量:
SqlDataAdapter da;
DataSet ds;
DataTable dtSource;
int PageCount;
int maxRec;
int pageSize;
int currentPage;
int recNo;
					
6.复制以下代码并将其粘贴到紧挨在静态的空 Main 方法之后,以使其作用范围为窗体级:
private void LoadPage() {
     int i;
     int startRec;
     int endRec;
     DataTable dtTemp;

     //Clone the source table to create a temporary table.
     dtTemp = dtSource.Clone();

     if (currentPage == PageCount) {
	endRec = maxRec;
     }
     else {
	endRec = pageSize * currentPage;
     }
     startRec = recNo;

     //Copy rows from the source table to fill the temporary table.
     for (i = startRec; i < endRec; i++) {
	dtTemp.ImportRow(dtSource.Rows[i]);
	recNo += 1;
     }
     dataGrid1.DataSource = dtTemp;
     DisplayPageInfo();
}

private void DisplayPageInfo() {
     txtDisplayPageNo.Text = "Page " + currentPage.ToString() + "/ " + PageCount.ToString();
}

private bool CheckFillButton() {
  // Check if the user clicks the "Fill Grid" button.
  if (pageSize == 0) {
     MessageBox.Show("Set the Page Size, and then click the Fill Grid button!");
     return false;
  }
  else {
     return true;
  }
}
					
7.将以下代码粘贴到 Form1_Load 事件过程中:
   //Open Connection.
   SqlConnection conn = new SqlConnection("Server=server;uid=login;pwd=pwd;database=northwind");

   //Set the DataAdapter's query.
   da = new SqlDataAdapter("select * from customers", conn);
   ds = new DataSet();

   //Fill the DataSet.
   da.Fill(ds, "customers");

   //Set the source table.
   dtSource = ds.Tables["customers"];
					
8.修改上述代码中出现的连接字符串,使之适合您的环境:
SqlConnection conn = new SqlConnection("Server=server;uid=login;pwd=pwd;database=northwind");
					
9.双击 Fill Grid,打开 btnFillGrid 的代码窗口。复制以下代码并将其粘贴到 btnFillGrid_Click 事件过程中:
    // Set the start and max records.
    pageSize = Convert.ToInt32(txtPageSize.Text);
    maxRec = dtSource.Rows.Count;
    PageCount = maxRec / pageSize;

    //Adjust the page number if the last page contains a partial page.
    if ((maxRec % pageSize) > 0) {
	   PageCount += 1;
    }

    // Initial seeings
    currentPage = 1;
    recNo = 0;

    // Display the content of the current page.
    LoadPage();
					
10.双击 First Page,打开 btnFirstPage 的代码窗口。复制以下代码并将其粘贴到 btnFirstPage_Click 事件过程中:
   if (CheckFillButton() == false) {
     return;
   }

   //Check if you are already at the first page.
   if (currentPage == 1) {
       MessageBox.Show("You are at the First Page!");
       return;
   }

   currentPage = 1;
   recNo = 0;
   LoadPage();
					
11.双击 Next Page,打开 btnNextPage 的代码窗口。复制以下代码并将其粘贴到 btnNextPage_Click 事件过程中:
   //If the user did not click the "Fill Grid" button, then return.
   if (CheckFillButton() == false) {
      return;
   }

   //Check if the user clicks the "Fill Grid" button.
   if (pageSize == 0) {
     MessageBox.Show("Set the Page Size, and then click the Fill Grid button!");
     return;
   }

   currentPage += 1;
   if (currentPage > PageCount) {
       currentPage = PageCount;
       //Check if you are already at the last page.
       if (recNo == maxRec) {
           MessageBox.Show("You are at the Last Page!");
  	   return;
       }
   }
   LoadPage();
					
12.双击 Previous Page,打开 btnPreviousPage 的代码窗口。复制以下代码并将其粘贴到 btnPreviousPage_Click 事件过程中:
   if (CheckFillButton() == false) {
      return;
   }

   if (currentPage == PageCount) {
      recNo = pageSize * (currentPage - 2);
   }

   currentPage -= 1;
   //Check if you are already at the first page.
   if (currentPage < 1) {
      MessageBox.Show("You are at the First Page!");
      currentPage = 1;
      return;
   }
   else {
      recNo = pageSize * (currentPage - 1);
   }
   LoadPage();
					
13.双击 Last Page,打开 btnLastPage 的代码窗口。复制以下代码并将其粘贴到 btnLastPage_Click 事件过程中:
   if (CheckFillButton() == false) {
      return;
   }

   //Check if you are already at the last page.
   if (recNo == maxRec) {
      MessageBox.Show("You are at the Last Page!");
      return;
   }
   currentPage = PageCount;
   recNo = pageSize * (currentPage - 1);
   LoadPage();
					
14.按 F5 键生成并运行此项目。
15.默认情况下,Page Size(页面大小)设置为 5 条记录。您可以在文本框中更改此设置。
16.单击 Fill Grid。注意,DataGrid 中填入了 5 条记录。
17.单击 First PageNext PagePrevious PageLast Page 可以来回浏览页面。
返回页首

疑难解答

该方法只适用只读 DataGrid 控件。当您向临时 DataTable 对象中导入一行时,这只是一个副本,而您做的更改没有保存到主表中。
如果您想让用户能够通过一个 DataRelation 对象定位到子记录,或者如果您的记录以父子关系相链接并且同时出现在窗体上,则不能使用此方法(也不能用集合或数组)。
返回页首

参考

有关 ADO.NET 的更多信息,请访问以下 MSDN 网站: 有关更多信息,请参阅以下 Microsoft .NET Framework SDK 文档:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值