winform中DataGridView实现分页功能
C#winform分页查询的实现示例

C#winform分页查询的实现⽰例1、功能需求本实例将通过c# winform实现简单的分页功能,需要的基础知识有SQL语句,c#语⾔基础以及c# winform的⼀些简单知识。
2、界⾯设计这是⼀个简单的分页查询的界⾯,可以输⼊任意字段进⾏查询,这四个字段在数据准备会提到,整体界⾯如图1所⽰。
图1中间显⽰是⼀个DataGridView,编辑好列和id,SortMode选择Automatic,意思是所有列⾃动铺满DataGridView,如图2所⽰。
图23、数据准备本实例涉及到删查改,因此要有数据表以及对数据表进⾏操作的代码。
数据库表⾮常简单,如图3所⽰,分别有对应四个字段。
图3later_back模型类对应数据库操作类代码如下:using MySql.Data.MySqlClient;using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using WindowsFormsApp1.Bean;namespace WindowsFormsApp1.SqlHelper{class LaterBackHelper{public LaterBackHelper(){}public void insert(LaterBack laterBack){string sql = "insert into later_back(dormitory_id,student_no,time,reason) values('" + laterBack.Dormitory_id + "','" + laterBack.Student_no + "'," + "'" + laterBack.Time + "'," + "'" + laterBack.Reason + "')";try{int iRet = SqlHelperBase.ExecuteSql(sql);if (iRet > 0){MessageBox.Show("新增成功", "系统提⽰");}else{MessageBox.Show("新增失败", "系统提⽰");}}catch (Exception){throw;}}public int update(LaterBack laterBack){string sql = "update later_back set reason='" + laterBack.Reason + "' where student_no= '" + laterBack.Student_no + "' and"+ " time = '" + laterBack.Time + "' and " + " dormitory_id= '" + laterBack.Dormitory_id + "'";try{int iRet = SqlHelperBase.ExecuteSql(sql);//这⾥返回的是受影响的⾏数,为int值。
C#DataGridView分页显示代码详解

} }
上边红色部分获取总行数是调用的数据操作层里的 getds 方法返回一个数据集, 类和方法如下:
class DBExecute { string G_str_connectionString = @"Data
/// 第一页 private void toolStripButton2_Click(object sender, EventArgs e) {
if (pageall > 1) {
start = 0; page = 1; tslPage.Text = page.ToString(); this.dataGridView1.DataSource = gettb(selectsql ,start,count,"table")‘;//绑定 DataGridView } }
C#DataGridView 分页显示代码详解
DBClass.DBExecute dbexecute = new DBExecute();
string connectionString = @"Data Source=ServerName;Database=DatabaseName;integrated security=true";
// 上一页 private void toolStripButton3_Click(object sender, EventArgs e) {
if (page >1) {
page--; start -= 20; tslPage.Text = page.ToString();
winform中DataGridView实现分页功能

winform中DataGridView实现分页功能转载⾄以前都是做web开发,最近接触了下WinForm,发现WinForm分页控件好像都没有,⽹上搜索了⼀下,发现有很多⽹友写的分页控件,分页效果应该都能实现吧,只是其风格都不是很符合我想要的。
做web的时候,我习惯了Extjs的Grid分页效果,所以也想在WinForm中做个类似的效果,所以咬咬⽛,做个⼭寨版本的吧,虽然⾃⼰写费时费⼒,在项⽬进度考虑中不是很可取,但是还是特别想⼭寨⼀回,做⾃⼰喜欢的风格。
按照惯例,还是先看看实现效果图吧(有图有真像,才好继续下⽂呀)应⽤效果:(效果有点难看,因为我是刚装的xp系统,还是经典主题,如果换成Win7系统或其他主题,效果还是会很不错的)我们要做的就是上图显⽰的⼀个⾃定义控件,这个效果参考⾃我做web开发使⽤的Extjs之Grid的分页效果(如下图)Extjs的动画效果我们暂时就不实现了,这⾥只做个外观看起来想像即可,完全⼀样就脱离“⼭寨”概念了,总要⽐⼈家差点吧,谁让咱是模仿呢!⾔归正传,我们现在就看看具体怎么实现吧:第⼀步:先布局注:我们创建的是⽤户⾃定义控件,⽽不是WinForm窗体就是先做出个显⽰效果,这个布局很简单,在这就不多说,重点就是“⾸页、前⼀页、后⼀页、末页”图标,每个图标分两种,⼀是能点击的⾼亮效果,⼀个是灰⾊不不能点击。
以下是套图:(⼤家如果不喜欢,可以去做成⾃⼰喜欢的风格图⽚)第⼆步:编写分页代码布局好了,那么第⼆步我们就要代码实现正确显⽰⽂字信息,分页事件,每页条数选择事件,公开属性和事件。
以下是完整代码:1///<summary>2///声明委托3///</summary>4///<param name="e"></param>5public delegate void EventPagingHandler (EventArgs e);6public partial class Paging : UserControl7 {8public Paging()9 {10 InitializeComponent();11 }12public event EventPagingHandler EventPaging;13#region公开属性14private int _pageSize = 50;15///<summary>16///每页显⽰记录数(默认50)17///</summary>18public int PageSize19 {20get21 {22return _pageSize;23 }24set25 {26if (value > 0)27 {28 _pageSize = value;29 }30else31 {32 _pageSize = 50;33 }boPageSize.Text = _pageSize.ToString();35 }36 }37private int _currentPage = 1;38///<summary>39///当前页40///</summary>41public int CurrentPage42 {43get44 {45return _currentPage;46 }47set48 {49if (value > 0)50 {51 _currentPage = value;52 }53else54 {55 _currentPage = 1;56 }5758 }59 }60private int _totalCount = 0;61///<summary>62///总记录数63///</summary>64public int TotalCount65 {66get67 {68return _totalCount;69 }70set71 {72if (value >= 0)73 {74 _totalCount = value;75 }76else77 {78 _totalCount = 0;79 }80this.lblTotalCount.Text = this._totalCount.ToString();81 CalculatePageCount();82this.lblRecordRegion.Text = GetRecordRegion();83 }84 }8586private int _pageCount = 0;87///<summary>88///页数89///</summary>90public int PageCount91 {92get93 {94return _pageCount;95 }96set97 {98if (value >= 0)99 {100 _pageCount = value;101 }102else103 {104 _pageCount = 0;105 }106this.lblPageCount.Text = _pageCount + "";107 }108 }109#endregion110111///<summary>112///计算页数113///</summary>114private void CalculatePageCount()115 {116if (this.TotalCount > 0)117 {118this.PageCount = Convert.ToInt32 (Math.Ceiling (Convert.ToDouble (this.TotalCount) / Convert.ToDouble (this.PageSize) ) ); 119 }120else121 {122this.PageCount = 0;123 }124 }125126///<summary>127///获取显⽰记录区间(格式如:1-50)128///</summary>129///<returns></returns>130private string GetRecordRegion()131 {132if (this.PageCount == 1) //只有⼀页133 {134return"1-" + this.TotalCount.ToString();135 }136else//有多页137 {138if (this.CurrentPage == 1) //当前显⽰为第⼀页139 {140return"1-" + this.PageSize;141 }142else if (this.CurrentPage == this.PageCount) //当前显⽰为最后⼀页143 {144return ( (this.CurrentPage - 1) * this.PageSize + 1) + "-" + this.TotalCount;145 }146else//中间页147 {148return ( (this.CurrentPage - 1) * this.PageSize + 1) + "-" + this.CurrentPage * this.PageSize;149 }150 }151 }152153///<summary>154///数据绑定155///</summary>156public void Bind()157 {158if (this.EventPaging != null)159 {160this.EventPaging (new EventArgs() );161 }162if (this.CurrentPage > this.PageCount)163 {164this.CurrentPage = this.PageCount;165 }166this.txtBoxCurPage.Text = this.CurrentPage + "";167this.lblTotalCount.Text = this.TotalCount + "";168this.lblPageCount.Text = this.PageCount + "";169this.lblRecordRegion.Text = GetRecordRegion();170if (this.CurrentPage == 1)171 {172this.btnFirst.Enabled = false;173this.btnPrev.Enabled = false;174this.btnFirst.Image = global::CHVM.Properties.Resources.page_first_disabled; 175this.btnPrev.Image = global::CHVM.Properties.Resources.page_prev_disabled; 176 }177else178 {179this.btnFirst.Enabled = true;180this.btnPrev.Enabled = true;181this.btnFirst.Image = global::CHVM.Properties.Resources.page_first;182this.btnPrev.Image = global::CHVM.Properties.Resources.page_prev;183 }184if (this.CurrentPage == this.PageCount)185 {186this.btnNext.Enabled = false;187this.btnLast.Enabled = false;188this.btnNext.Image = global::CHVM.Properties.Resources.page_next_disabled; 189this.btnLast.Image = global::CHVM.Properties.Resources.page_last_disabled; 190 }191else192 {193this.btnNext.Enabled = true;194this.btnLast.Enabled = true;195this.btnNext.Image = global::CHVM.Properties.Resources.page_next;196this.btnLast.Image = global::CHVM.Properties.Resources.page_last;197 }198if (this.TotalCount == 0)199 {200this.btnFirst.Enabled = false;201this.btnPrev.Enabled = false;202this.btnNext.Enabled = false;203this.btnLast.Enabled = false;204this.btnFirst.Image = global::CHVM.Properties.Resources.page_first_disabled; 205this.btnPrev.Image = global::CHVM.Properties.Resources.page_prev_disabled; 206this.btnNext.Image = global::CHVM.Properties.Resources.page_next_disabled; 207this.btnLast.Image = global::CHVM.Properties.Resources.page_last_disabled; 208 }209 }210211private void btnFirst_Click (object sender, EventArgs e)212 {213this.CurrentPage = 1;214this.Bind();215 }216217private void btnPrev_Click (object sender, EventArgs e)218 {219this.CurrentPage -= 1;220this.Bind();221 }222223private void btnNext_Click (object sender, EventArgs e)224 {225this.CurrentPage += 1;226this.Bind();227 }228229private void btnLast_Click (object sender, EventArgs e)230 {231this.CurrentPage = this.PageCount;232this.Bind();233 }234235///<summary>236///改变每页条数237///</summary>238///<param name="sender"></param>239///<param name="e"></param>240private void comboPageSize_SelectedIndexChanged (object sender, EventArgs e) 241 {242this.PageSize = Convert.ToInt32 (comboPageSize.Text);243this.Bind();244 }245 }246247这⾥重点提两点:⼀是图⽚切换:248this.btnFirst.Image = global::CHVM.Properties.Resources.page_first_disabled;249 Image对象是在Properties.Resource.resx中⾃动⽣成的,代码如下:250internal static System.Drawing.Bitmap page_first251 {252get {253object obj = ResourceManager.GetObject ("page-first", resourceCulture);254return ( (System.Drawing.Bitmap) (obj) );255 }256 }257258internal static System.Drawing.Bitmap page_first_disabled259 {260get {261object obj = ResourceManager.GetObject ("page_first_disabled", resourceCulture);262return ( (System.Drawing.Bitmap) (obj) );263 }264 }265⼆是应⽤了委托事件:我们在这定义了⼀个分页事件266public event EventPagingHandler EventPaging;267在数据绑定⽅法中实现它:268///<summary>269///数据绑定270///</summary>271public void Bind()272 {273if (this.EventPaging != null)274 {275this.EventPaging (new EventArgs() );276 }277//… 以下省略278 }279这⾥需要⼤家对C#的委托和事件有⼀定的了解,不清楚的可以直接使⽤,或者先去查阅相关参考资料,这⾥我们就不谈委托机制了。
GridView+存储过程实现真分页

GridView+存储过程实现真分页GridView+存储过程实现'真分页',有需要的朋友可以参考下。
GridView,中的表格控件,和Repeater控件一样,在中都是很常用的两个表格控件,GridView自己也有分页功能,实现是将一张表的数据全部绑定到GridView,然后再进行分页,这就是通常我们所说的'假分页'。
在应对小数据量上完全没问题,但问题往往没有那么简单,在面对大数据量的问题上,GridView自己的分页还是力不从心,严重影响效率,用户体验也不好。
要解决这个问题,实现'真分页',就要从根上去分析,为什么'假分页'速度慢,因为它一次获取的是整张表的数据,但是最后显示的只是一页,所以,如果我们只查询需要显示的一页数据(上页下页,首页尾页,跳页都只查询需要的一页数据),在绑定到GridView中,查询分页的速度会快很多,这就是所谓的'真分页'了。
剩下的问题就是SQL语句去实现了。
经过一番查询研究,通过存储过程实现真分页效果挺好。
存储过程SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [dbo].[PROC_GridViewPage]--@TableList Varchar(200), --查询的字段,用逗号隔开@TableName Varchar(30), --查询的表名--@SelectWhere Varchar(500),--查询的条件@SelectOrderId Varchar(20), --表主键字段名@SelectOrder Varchar(200), --排序,order by 列名@intPageNo int, --页号@intPageSize int, --每页显示数@RecordCount int OUTPUT --总记录数(OUTPUT表示是存储过程输出型参数,接收方法见DAL层)ASdeclare @TmpSelect NVarchar(600) --声明变量set nocount on --关闭计数--获取表中记录总数set @TmpSelect = 'select @RecordCount = count(*) from '+@TableName+' ' --可以添加查询条件+@SelectWhereexecute sp_executesql@TmpSelect, --执行上面的sql语句N'@RecordCount int OUTPUT' , --执行输出数据的sql语句,output出总记录数@RecordCount OUTPUTif (@RecordCount = 0) --如果表中没有,则返回0return 0/*判断页数是否正确*/if (@intPageNo - 1) * @intPageSize > @RecordCount --页号大于总页数,返回错误return (-1)set nocount off--打开计数BEGINset @TmpSelect = 'select top '+str(@intPageSize)+' '+ '*' +'from '+@TableName+' where '+@SelectOrderId+' not in(select top '+str((@intPageNo-1)*@intPageSize)+' '+@SelectOrderId+' from '+@TableName+' '+@SelectOrder+') '+@SelectOrder ENDexecute sp_executesql @TmpSelectreturn(@@rowcount)GOsp_executesql?和EXEC一样在存储过程中执行sql语句的命令,平时我们见到和使用的通常是EXEC,sp_executesql的不同之出在于,它提供了一个借口,支持参数的输入和输出,灵活性更好,而且sp_executesql的执行性能更好。
如何实现GridView的手动分页

如何实现GridView的手动分页我们可以这样做。
先要在Html界面中GridView中增加AllowPaging="True"接着做下面的//在page_load事件中将GridView绑定数据库protected void Page_Load(object sender, EventArgs e){string sqlstr=select * from TABLE;sqlconnection conn=new sqlconnection("数据库连接字串");DataSet mydataset = new DataSet();SqlDataAdapter myds = new SqlDataAdapter();myds.SelectCommand = new SqlCommand(sqlstr, conn);myds.Fill(mydataset);this.GridView1.DataSource = mydataset;mydataset.Dispose();myds.Dispose();conn.Close();conn.Dispose();GridView1.DataBind();}//GridView有一个PageIndexChanging事件protected void GridView1_PageIndexChanging(object sender, GridViewPag eEventArgs e){GridView1.PageIndex = e.NewPageIndex;GridView1.DataBind();}这样就可以实现啦!要使用手动分页前提是GridView没有使用数据源控件(sqldatasource.....)的时候。
请教GridView的手动分页如何实现?谢谢!请教GridView的手动分页(自定义分页)如何实现?比如已知有10000条数据,我要GridView的分页功能来显示数据,但是自动分页功能需要每次都取出全部的10000条数据,这样效率不高,所以就要求只用设置GridView的分页数如1000页(每页10知),当选择第n页时才从数据库中取出对应的数据,请问怎样实现?谢谢!结合存储过程写的通用搜索分页程序存储过程改自bigeagle的论坛分页程序。
MicrosoftVisualStudio2005中GridView手动分页,自定义分页(精)

1.创建存储过程,数据库为Microsoft SQL Server 2000,use Northwindgoselect * from Ordersgoif exists(select * from sysobjects where name='proc_ordersinfo' and type='P')drop procedure proc_ordersinfogo--创建查询表Orders的存储过程,@PageIndex 页面索引(页面索引=当前页数-1),@PageSize 每页显示数据的多少(多少行)--@PageCount 页面总数,@RecordCount 表中的记录总数create procedure proc_ordersinfo@PageIndex int,@PageSize int,@PageCount int outasdeclare @RecordCount int,@strsql nvarchar(1000)select @RecordCount=count(*) from ordersset @PageCount=ceiling(@RecordCount*1.0/@PageSize)--第1种情况,表只够分成一页if @PageIndex=0 or @PageCount<=1set @strsql=N'select top'+str(@PageSize)+'* from Orders order by OrderID desc' --第2种情况,要查询表的最后一页(可看作表Orders已被分成几个页了)else if @PageIndex=@PageCount-1set @strsql=N'select * from(selecttop'+str(@RecordCount-@PageIndex*@PageSize)+'* from Orders order by OrderID asc) TempTable order by OrderID desc'--第3种情况,查询非表的最后一页elseset @strsql=N'select top'+str(@PageSize)+'* from(selecttop'+str(@RecordCount-@PageIndex*@PageSize)+'* from Orders order by OrderID asc) TempTable order by OrderID desc'--执行SQL语句exec (@strsql)go2.创建显示数据的方法class CConnDB里的方法returnConn()返回数据库连接using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;//导入需要使用的命名空间using System.Data.SqlClient;/// <summary>/// CConnDB 的摘要说明/// </summary>public class CConnDB{public CConnDB(){//// TODO: 在此处添加构造函数逻辑//}public SqlConnection returnConn() {SqlConnection sconn = newSqlConnection("server=.;database=Northwind;uid=sa;pwd=sa");return sconn;}}class CDisplayOdersInfo里的方法DisplayOrdersInfo()返回一个DataSetusing System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;//导入需要使用的命名空间using System.Data.SqlClient;/// <summary>/// CDisplayOdersInfo 的摘要说明/// </summary>public class CDisplayOdersInfo{CConnDB ccdb = new CConnDB();//pageCount为页面总数private int pageCount;public CDisplayOdersInfo(){//// TODO: 在此处添加构造函数逻辑//}public DataSet DisplayOrdersInfo(int pageIndex,int pageSize) {SqlConnection sconn = ccdb.returnConn();SqlCommand scmd = new SqlCommand("proc_ordersinfo",sconn);scmd.Parameters.Add(new SqlParameter("@PageIndex",SqlDbType.Int));scmd.Parameters[0].Value = pageIndex;scmd.Parameters.Add(new SqlParameter("@PageSize",SqlDbType.Int));scmd.Parameters[1].Value = pageSize;scmd.Parameters.Add(new SqlParameter("@PageCount",SqlDbType.Int));scmd.Parameters[2].Direction = ParameterDirection.Output;mandType = CommandType.StoredProcedure;SqlDataAdapter sda = new SqlDataAdapter(scmd);DataSet ds = new DataSet();sda.Fill(ds);pageCount = (int)scmd.Parameters[2].Value;return ds;}public int returnPageCount() {return pageCount;}}3.页面设计和页面代码页面设计<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml" ><head runat="server"><title>无标题页</title></head><body><form id="form1" runat="server"><div> <asp:LinkButton ID="lbPrev" runat="server"OnClick="lbPrev_Click">上一页</asp:LinkButton><asp:Label ID="lblPageNum" runat="server"></asp:Label><asp:LinkButton ID="lbNext" runat="server" OnClick="lbNext_Click">下一页</asp:LinkButton><asp:GridView ID="gvMain" runat="server"></asp:GridView></div></form></body></html>页面代码using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;public partial class _Default : System.Web.UI.Page{CDisplayOdersInfo cdoi = new CDisplayOdersInfo();//pageIndex 页面索引(页面索引=当前页数-1),pageSize 每页显示多少数据(多少行)//pageCount 页面的总页数private static int pageIndex = 0;private static int pageSize = 50;private static int pageCount = 0;protected void Page_Load(object sender, EventArgs e){if (!IsPostBack) {GridViewDataBind();}}private void GridViewDataBind() {DataSet ds= cdoi.DisplayOrdersInfo(pageIndex,pageSize);gvMain.DataSource = ds;gvMain.DataBind();pageCount = cdoi.returnPageCount();lblPageNum.Text ="当前页数:"+ Convert.ToString(pageIndex+1);}protected void lbPrev_Click(object sender, EventArgs e){pageIndex--;if (pageIndex < 0) {Response.Write("<script language=javascript>alert('已到首页!')</script>");pageIndex++;return;}GridViewDataBind();}protected void lbNext_Click(object sender, EventArgs e){pageIndex++;if (pageIndex >=pageCount){Response.Write("<script language=javascript>alert('已到尾页!')</script>");pageIndex--;return;}GridViewDataBind();}}。
让DataGridView控件里的记录分页显示

让DataGridView控件里的记录分页显示一、数据准备二、分页逻辑实现记录分页显示的核心逻辑是将数据按照每页显示的记录数量进行切割,然后根据用户的操作加载不同的数据页。
下面是一个简单的分页逻辑示例:1.定义分页相关的变量:```csharpint pageSize = 10; // 每页显示的记录数量int totalPages = (data.Count + pageSize - 1) / pageSize; // 总页数``````csharpList<Record> currentPageData = data.Skip((currentPage - 1) * pageSize).Take(pageSize).ToList(;dataGridView.DataSource = currentPageData;``````csharpprivate void PreviousButton_Click(object sender, EventArgs e) if (currentPage > 1)currentPage--;LoadPageData(;}private void NextButton_Click(object sender, EventArgs e)if (currentPage < totalPages)currentPage++;LoadPageData(;}```三、界面设计四、性能优化在虚拟模式下,DataGridView控件只维护当前可见区域的数据,并在需要显示时动态加载数据。
可以通过实现DataGridView控件的CellValueNeeded事件来实现懒加载和虚拟模式。
具体实现方法超出了本文的范围,但是可以在MSDN文档或者各种技术论坛上找到详细的教程和示例。
总结:。
C#分页最好的实现方法

DECLARE @PRERECCOUNT VARCHAR(10) DECLARE @CURRECCOUNT VARCHAR(10) SELECT @@TOTALCOUNT=COUNT(*) FROM DXS_STAFF_ACTIVE IF @@TOTALCOUNT>(@STARTNO+1)*@STAFFNUM
LoadData(); } if (e.ClickedItem.Text == "下一页")
{ pageCurrent++; if (pageCurrent > pageCount) { MessageBox.Show("已经是最后一页,请点击“上一页”查看!"); return; } else { nCurrent=pageSize*(pageCurrent-1);
具体的建立存储过程我就不说了,简单说明一下以上语句的作用把。 CREATE PROCEDURE dt_DXS_STAFF_ACTIVE 其 实 就 是 生 成 一 个 名 为
dt_DXS_STAFF_ACTIVE 的存储过程,具体命名按实际需要。
TOTALCOUNT:数据行总数。 REALNUM:当前记录数。 以下是将数据导入页面的函数:
ELSE BEGIN SET @PRERECCOUNT= CAST( @STARTNO * @STAFFNUM AS VARCHA
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
winform中DataGridView实现分页功能在winform的设计中,要实现对DataGridView控件的分页功能,需要两个控件:BindingSource、BindingNavigator,根据需求可对BindingNavigator进行自由的扩展,下图的示例则是根据一般需求对分页功能的实现。
红色区域是对BindingNavigator控件扩展后的效果。
具体实现过程://窗体构造方法中定义分页所需变量:int pageSize = 0; //每页显示行数int nMax = 0; //总记录数int pageCount = 0; //页数=总记录数/每页显示行数int pageCurrent = 0; //当前页号int nCurrent = 0; //当前记录行DataTable dtInfo = new DataTable(); //存取查询数据结果//分页功能实现public void InitDataSet(){//判断每页显示记录数是否为空,在初始话窗体时为真if (txtRecordNumOfPage.Text.Trim() == ""){try{//pageSize =Convert.ToInt16(ConfigurationManager.AppSettings["PageSize"]); //设置页面行数//读取配置文件中设置的每页显示条数string szConfigFileName = Application.ExecutablePath + ".config"; XmlDocument doc = new XmlDocument();doc.Load(szConfigFileName);XmlNode root = doc.SelectSingleNode("configuration");XmlNode node =root.SelectSingleNode("appSettings/add[@key='PageSize']");XmlElement el = node as XmlElement;pageSize = Convert.ToUInt16(el.GetAttribute("value"));}catch{}if (pageSize == 0){pageSize = 20; //如果读取配置文件失败,则默认将每页显示条数设置为20}txtRecordNumOfPage.Text = pageSize.ToString(); //界面显示的“每页记录数”赋值}else{//读取界面设置的每页显示条数pageSize = Convert.ToUInt16(txtRecordNumOfPage.Text.Trim());}//总记录数赋值nMax = dtInfo.Rows.Count;pageCount = (nMax / pageSize); //采用整除计算页数//判断整除后是否有余数,有则对页数进行+1if ((nMax % pageSize) > 0) pageCount++;pageCurrent = 1; //当前页数从1开始nCurrent = 0; //当前记录数从0开始//调用显示数据方法LoadData();}//显示数据方法private void LoadData(){int nStartPos = 0; //当前页面开始记录行int nEndPos = 0; //当前页面结束记录行//判断查询结果是否为空if (dtInfo.Rows.Count == 0){dgvExperInfo.DataSource = null;return;}else{DataTable dtTemp = dtInfo.Clone(); //克隆DataTable结构,即将字段名称进行复制if (pageCurrent == 1){bindingNavigatorMoveFirstPage.Enabled = false;bindingNavigatorMovePreviousPage.Enabled = false;}else{bindingNavigatorMoveFirstPage.Enabled = true;bindingNavigatorMovePreviousPage.Enabled = true;}if (pageCurrent == pageCount){nEndPos = nMax;bindingNavigatorMoveLastPage.Enabled = false;bindingNavigatorMoveNextPage.Enabled = false;}else{bindingNavigatorMoveLastPage.Enabled = true;bindingNavigatorMoveNextPage.Enabled = true;nEndPos = pageSize * pageCurrent;}nStartPos = nCurrent;lblPageCount.Text = pageCount.ToString(); //界面显示总页数 lblCurrentPage.Text = Convert.ToString(pageCurrent);//当前页数txtCurrentPage.Text = Convert.ToString(pageCurrent);//跳转到页数的显示//从元数据源复制记录行for (int i = nStartPos; i < nEndPos; i++){dtTemp.ImportRow(dtInfo.Rows[i]);nCurrent++;}bdsInfo.DataSource = dtTemp;bdnInfo.BindingSource = bdsInfo;dgvExperInfo.DataSource = bdsInfo;dgvExperInfo.ClearSelection();}}//BindingNavigator控件上的项目点击事件,通过配置各个Item的Text值进行判断执行private void bdnInfo_ItemClicked(object sender, ToolStripItemClickedEventArgs e){if (e.ClickedItem.Text == "上一页"){pageCurrent--;if (pageCurrent <= 0){MessageBox.Show("已经是第一页,请点击“下一页”查看!");pageCurrent++;return;}else{nCurrent = pageSize * (pageCurrent - 1);}LoadData();}if (e.ClickedItem.Text == "下一页"){pageCurrent++;if (pageCurrent > pageCount){MessageBox.Show("已经是最后一页,请点击“上一页”查看!"); pageCurrent--;return;}else{nCurrent=pageSize*(pageCurrent-1);}LoadData();}if (e.ClickedItem.Text == "首页"){pageCurrent = 1;nCurrent = 0;LoadData();}if (e.ClickedItem.Text == "尾页"){pageCurrent = pageCount;nCurrent = pageSize * (pageCurrent - 1);LoadData();}}//跳转页实现private void btnPage_Click(object sender, EventArgs e){if (txtCurrentPage.Text.Trim() != ""){pageCurrent = Convert.ToInt16(txtCurrentPage.Text.Trim());//若输入页号大于最大显示页号,则跳转至最大页if (pageCurrent > pageCount){pageCurrent = pageCount;nCurrent = pageSize * (pageCurrent - 1);}//若输入页号小于1,则跳转至第一页else if (pageCurrent < 1){pageCurrent = 1;nCurrent = 0;LoadData();}//跳转至输入页号else{nCurrent = pageSize * (pageCurrent - 1); //当前行数定位 }//调用加载数据方法LoadData();}}private void txtCurrentPage_TextChanged(object sender, EventArgs e){bool IsNum = true;foreach (char c in txtCurrentPage.Text.Trim()){if (!char.IsNumber(c)) { IsNum = false; break; }}if (IsNum == false){txtCurrentPage.Text = pageCurrent.ToString();}}//当前页回车事件调用跳转页的操作private void txtCurrentPage_KeyPress(object sender, KeyPressEventArgs e) {if (e.KeyChar == 13){btnPage_Click(sender,e);}}//每页显示记录数变更事件private void txtRecordNumOfPage_TextChanged(object sender, EventArgs e) {bool IsNum = true;foreach (char c in txtRecordNumOfPage.Text.Trim()){if (!char.IsNumber(c)) { IsNum = false; break; }}if (IsNum == false){txtRecordNumOfPage.Text = pageSize.ToString();}//判断输入的每页显示条数是否为空或是否为0,输入长度是否大于4位等情况if (txtRecordNumOfPage.Text.Trim() == "" ||Convert.ToUInt32(txtRecordNumOfPage.Text.Trim()) == 0 ||txtRecordNumOfPage.Text.Trim().Length > 4){txtRecordNumOfPage.Text = pageSize.ToString();}//规避了特殊情况后直接调用显示数据方法LoadDocInfoToDGV();}至此,winform中对DataGridView控件的分页功能已经实现,该方法是在网上查了相关资料后参照一些常用的分页效果进行了一些扩展,也在组长的要求下,完善了一些细节上的工作:由于屏幕分辨率的不同,用户可自行对每页显示条数进行设置,设置结果可以在关闭窗体的事件中保存至配置文件,下次进行默认读取;对分页控件中按钮操作的优化,判断是否能够使用的功能,代码中已经进行了体现;另外由于显示器分辨率不尽相同,需要在窗体加载时,设置控件显示的位置,也同样需要代码进行控制。