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

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

察看本文应用于的产品

文章编号

:

307710

最后修改

:

2005年3月23日

修订

:

3.1

本文的发布号曾为 CHS307710

本页

概要

要求

向 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 属性 Button btnFirstPage First Page Button btnNextPage Next Page TextBox txtDisplayPageNo Button btnPreviousPage Previous Page Button btnLastPage Last Page TextBox txtPageSize 5 Button btnFillGrid Fill Grid DataGrid dataGrid1

控件

Name 属性

Text 属性

Button

btnFirstPage

First Page

Button

btnNextPage

Next Page

TextBox

txtDisplayPageNo

Button

btnPreviousPage

Previous Page

Button

btnLastPage

Last Page

TextBox

txtPageSize

5

Button

btnFillGrid

Fill Grid

DataGrid

dataGrid1

控件

Name 属性

Text 属性

Button

btnFirstPage

First Page

Button

btnNextPage

Next Page

TextBox

txtDisplayPageNo

Button

btnPreviousPage

Previous Page

Button

btnLastPage

Last Page

TextBox

txtPageSize

5

Button

btnFillGrid

Fill Grid

DataGrid

dataGrid1

4.

复制以下代码并将其粘贴到 Form1 代码窗口的顶部。确保每个命名空间只被引用一次。默认情况下,可能已经引用 System 和 System.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 Page、Next Page、Previous Page 或 Last Page 可以来回浏览页面。

回到顶端

疑难解答

该方法只适用只读 DataGrid 控件。当您向临时 DataTable 对象中导入一行时,这只是一个副本,而您做的更改没有保存到主表中。

如果您想让用户能够通过一个 DataRelation 对象定位到子记录,或者如果您的记录以父子关系相链接并且同时出现在窗体上,则不能使用此方法(也不能用集合或数组)。

回到顶端

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏葡萄城控件技术团队

在Silverlight中动态绑定页面报表(PageReport)的数据源

ActiveReports 7中引入了一种新的报表模型——PageReport(页面布局报表),这种报表模型又细分了两种具体显示形式: o    固定页面布局...

19890
来自专栏林德熙的博客

win10 uwp 切换主题

一般我们的应用都要有多种颜色,一种是正常的白天颜色,一种是晚上的黑夜颜色,还需要一种辅助的高对比颜色。这是微软建议的,一般应用都要包含的颜色。

20710
来自专栏佳爷的后花媛

markdown欢迎使用Markdown编辑器写博客

14820
来自专栏IMWeb前端团队

微型UI库Riot介绍

本文作者:IMWeb 黄龙 原文出处:IMWeb社区 未经同意,禁止转载 定义 Riot:类似 React 的微型 UI 库 特点: 自定义标签 快速...

21090
来自专栏腾讯NEXT学位

使用Sublime Text编辑器,你所不知道的11个秘密!

16920
来自专栏拂晓风起

Flex 可以拖出窗口的panel 拖动panel变为窗口

13340
来自专栏c#开发者

Convert string to DateTime

如何使用 Visual C# .NET 对 DataGrid Windows 控件执行分页 察看本文应用于的产品 文章编号 : 307710 最后修改...

38290
来自专栏林德熙的博客

WPF 使用 Direct2D1 画图入门

实际上现在很多小伙伴对于渲染性能就是听到 DirectX 才会去搜索这个博客。我在博客园看到很少的博客讲到这个。即使有也很少会说如何使用 WPF 的。

18810
来自专栏jeremy的技术点滴

Video.js简单使用

2.6K90
来自专栏林德熙的博客

win10 uwp 获得Slider拖动结束的值

本文讲的是如何获得Slider移动结束的值,也就是触发移动后的值。如果我们监听ValueChanged,在我们鼠标放开之前,只要拖动不放,那么就不停触发,而我们...

8710

扫码关注云+社区

领取腾讯云代金券