WinForm DataGridView分页功能
WinForm 里面的DataGridView不像WebForm里面的GridView那样有自带的分页功能,需要自己写代码来实现分页,效果如下图: 分页控件 

.CS:

1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using System.Data.SqlClient;
10
11 namespace allenPageTest
12 {
13 public partial class Form2 : Form
14 {
15 public Form2()
16 {
17 InitializeComponent();
18 }
19
20 private void Form2_Load(object sender, EventArgs e)
21 {
22 BindDataWithPage(1);
23 }
24
25 //总记录数
26 public int RecordCount = 0;
27 private string strConn = @"server=.;database=test;uid=sa;pwd=1234";
28 private string strProcedure = "PageTest ";
29
30
31 /// <summary>
32 /// 绑定第Index页的数据
33 /// </summary>
34 /// <param name="Index"></param>
35 private void BindDataWithPage(int Index)
36 {
37 allenPage1.PageIndex = Index;
38 //winFormPager1.PageSize = 10;
39 DataTable dt = GetData(strConn, strProcedure, Index, allenPage1.PageSize);
40
41 dataGridView1.DataSource = dt;
42
43 //获取并设置总记录数
44 allenPage1.RecordCount = RecordCount;
45 }
46
47
48 /// <summary>
49 /// 获取数据源
50 /// </summary>
51 /// <param name="conn">连接对象</param>
52 /// <param name="strProcedure">存储过程名称</param>
53 /// <param name="pageIndex">页码</param>
54 /// <param name="pageSize">每一页显示的行数</param>
55 /// <returns></returns>
56 private DataTable GetData(string conn, string strProcedure, int pageIndex, int pageSize)
57 {
58
59 using (SqlConnection connection = new SqlConnection(conn))
60 {
61 SqlCommand command = new SqlCommand(strProcedure, connection);
62 command.CommandType = CommandType.StoredProcedure;//采用存储过程
63 command.Parameters.Add("@Table", SqlDbType.NVarChar, 1000).Value = "TableName";//对应的数据表名
64 command.Parameters.Add("@TIndex", SqlDbType.NVarChar, 100).Value = "Index";//主键ID
65 command.Parameters.Add("@Column", SqlDbType.NVarChar, 2000).Value = "*";//要查询的字段,*为全部字段
66 command.Parameters.Add("@Sql", SqlDbType.NVarChar, 3000).Value = " 1=1 ";//查询条件
67 command.Parameters.Add("@PageIndex", SqlDbType.Int, 8).Value = pageIndex.ToString();//当前页码
68 command.Parameters.Add("@PageSize", SqlDbType.Int, 8).Value = pageSize.ToString();//每一页显示的行数
69 command.Parameters.Add("@Sort", SqlDbType.NVarChar, 200).Value = " Column Name asc";//排序的字段
70 //打开连接
71 if (connection.State != ConnectionState.Open)
72 {
73 connection.Open();
74 }
75 try
76 {
77 //填充数据
78 SqlDataAdapter da = new SqlDataAdapter(command);
79 DataSet ds = new DataSet();
80 da.Fill(ds);
81 //获取总记录数
82 RecordCount = Convert.ToInt32(ds.Tables[1].Rows[0][0]);
83 //返回数据集
84 return ds.Tables[0];
85
86 }
87 catch (SqlException err)
88 {
89 MessageBox.Show(err.Message);
90 return null; ;
91 }
92 finally
93 {
94 connection.Close();
95 }
96 }
97 }
98
99 private void allenPage1_PageIndexChanged(object sender, EventArgs e)
100 {
101 BindDataWithPage(allenPage1.PageIndex);
102 }
103 }
104 }

存储过程:

1 IF EXISTS(SELECT * FROM SYSOBJECTS WHERE NAME='PageTest')
2 DROP PROC PageTest
3 GO
4 CREATE PROCEDURE [dbo].[PageTest]
5 @Table VARCHAR(1000), --表名,多表是请使用 tA a inner join tB b On a.AID = b.AID
6 @TIndex NVARCHAR(100), --主键
7 @Column NVARCHAR(2000) = '*',--要查询的字段,全部字段就为*
8 @Sql NVARCHAR(3000) = '',--Where条件
9 @PageIndex INT = 1, --开始页码
10 @PageSize INT = 10, --每页查询数据的行数
11 @Sort NVARCHAR(200) = '' --排序的字段
12
13 AS
14
15
16
17 DECLARE @strWhere VARCHAR(2000)
18 DECLARE @strsql NVARCHAR(3900)
19 IF @Sql IS NOT NULL AND len(LTRIM(RTRIM(@Sql)))>0
20 BEGIN
21 SET @strWhere = ' WHERE ' + @Sql + ' '
22 END
23 ELSE
24 BEGIN
25 SET @strWhere = ''
26 END
27
28 IF (charindex(LTRIM(RTRIM(@TIndex)),@Sort)=0)
29 BEGIN
30 IF(@Sort='')
31 SET @Sort = @TIndex + ' DESC '
32 ELSE
33 SET @Sort = @Sort+ ' , '+@TIndex + ' DESC '
34 END
35 IF @PageIndex < 1
36 SET @PageIndex = 1
37
38 IF @PageIndex = 1
39 BEGIN
40 SET @strsql = 'SELECT TOP ' + str(@PageSize) +' '+@Column+ ' FROM ' + @Table + ' ' + @strWhere + ' ORDER BY '+ @Sort
41 END
42 ELSE
43 BEGIN
44
45 DECLARE @START_ID NVARCHAR(50)
46 DECLARE @END_ID NVARCHAR(50)
47 SET @START_ID = convert(NVARCHAR(50),(@PageIndex - 1) * @PageSize + 1)
48 SET @END_ID = convert(NVARCHAR(50),@PageIndex * @PageSize)
49 SET @strsql = ' SELECT '+@Column+ '
50 FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@Sort+') AS RowNum,
51 '+@Column+ '
52 FROM '+@Table +' WITH(NOLOCK) ' + @strWhere +') AS D
53 WHERE RowNum BETWEEN '+@START_ID+' AND ' +@END_ID +' ORDER BY '+@Sort
54 END
55 EXEC(@strsql)
56 PRINT @strsql
57 SET @strsql = 'SELECT Count(1) as TotalRecords FROM ' + @Table +' WITH(NOLOCK) ' + @strWhere
58 PRINT @strsql
59 EXEC(@strsql)

还有一种存储过程写法,仅供参考:

1 CREATE PROCEDURE pro_DataPageRowNumber
2 @SQL nvarchar(2000),--主句
3 @Order nvarchar(20),--排序
4 @PageIndex int,--当前页
5 @PageSize int,--每页显示数
6 @TotalRow int output--记录总数
7 AS
8 SET NOCOUNT ON;
9 declare @ExceSQL nvarchar(4000)--主句
10 declare @startRow as int--开始行
11 set @startRow=(@PageIndex-1)*@PageSize+1
12 declare @lastRow int--结束行
13 set @lastRow=@PageSize*@PageIndex
14 declare @RowNumber nvarchar(100)
15 set @RowNumber=',Row_NUMBER() OVER(ORDER BY '+@Order+') as RowNumber from '
16 set @SQL=Replace(@SQL,' from ',@RowNumber)
17 set @ExceSQL='select @TotalRow=max(RowNumber) from ('+@SQL+') as tmp'
18 execute sp_executesql @ExceSQl,N'@TotalRow in output',@TotalRow output
19 set @ExceSQL='select * from('+@SQL+') as tmp where RowNumber between'+ Convert(nvarchar,@startRow)
20 +' and '+Convert(nvarchar,@lastRow)
21 execute(@ExceSQL)
22
23 GO

分页的控件是自己写的一个用户控件,生成之后是一个DLL文件,直接引用在项目里面即可,有需要的可以留下邮箱。
WinForm DataGridView分页功能的更多相关文章
- C# Winform DataGridView分页功能的实现
// 1.定义几个所需的公有成员: ; //每页显示行数 ; //总记录数 ; //页数=总记录数/每页显示行数 ; //当前页号 ; //当前记录行 DataSet ds = new DataSet ...
- C# 实现DataGridView分页功能
C#实现DataGridView分页功能 2010-07-17 13:45:42| 分类: C#|字号 订阅 从界面可以看到,在设计时需要一个DataGridView.BindingNavi ...
- C# datagridview分页功能
winform开发是或多或少都会接触datagridview控件,如果数据量大,那么必须使用分页功能,但是datagridview自身并没有分页,所以我们要自己实现.在网上搜了一些发现没有太适合自己的 ...
- 创建有输出参数的存储过程并在c#中实现DataGridView分页功能
不足之处,欢迎指正! 创建有输出参数的存储过程 if exists(select * from sysobjects where name='usp_getPage1') drop procedure ...
- winform中DataGridView实现分页功能
WinForm轻松实现自定义分页 (转载) WinForm轻松实现自定义分页 (转载) 转载至http://xuzhihong1987.blog.163.com/blog/static/26731 ...
- DataGridView使用BindingNavigator实现简单分页功能
接上一篇<DataGridView使用自定义控件实现简单分页功能>,本篇使用BindingNavigator来实现简单分页功能.其实也只是借用了一个BindingNavigator空壳, ...
- winform里dataGridView分页代码,access数据库
winform里dataGridView分页,默认dataGridView是不分页的和webform里不一样,webform中GridView自带自带了分页. 现在c/s的程序很多时候也需要webfo ...
- 简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一
简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一 分页非为前端分页 和 后端分页,前端分页只有适用于B/S,B/S的呈现速度远远不如C/S,而C/S则没有这个问题,所以分页必然是 ...
- C#实现WinForm DataGridView控件支持叠加数据绑定
我们都知道WinForm DataGridView控件支持数据绑定,使用方法很简单,只需将DataSource属性指定到相应的数据源即可,但需注意数据源必须支持IListSource类型,这里说的是支 ...
随机推荐
- PHP常用数组函数介绍
array_splice() 删除数组中的指定元 array_splice(数组名,从前往后删的个数,new一个数组的大小);没有第三参数也就没有返数组,没有第三个参数时,第二个参数的意义为从前往后保 ...
- HTML CSS中比较重要的
在网页中有了HTML和CSS之后,我们还需要学会布局,我们可以将整个网页看做是一个DIV,然后将所有内容放入到这个DIV中. 内容中的每一块我们都可以用DIV包起来,我们将这个DIV看做一个盒子,然后 ...
- Java中封装、继承和多态
封装: 封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度. 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性. 访问修饰符有public,private,prot ...
- eclipse的tomcat内在溢出
在最前或最后加上: -Xms256m -Xmx512m -Xss2024K -XX:PermSize=128m -XX:MaxPermSize=256m
- POJ 3311 Hie with the Pie (状压DP)
dp[i][j][k] i代表此层用的状态序号 j上一层用的状态序号 k是层数&1(滚动数组) 标准流程 先预处理出所有合法数据存在status里 然后独立处理第一层 然后根据前一层的max推 ...
- .net frameworkAPI文档下载地址
http://www.msdn.hk/html/2014/5.html VS2013 ILdasm 反编译工具安装在下面地址里了 C:\Program Files (x86)\Microsoft SD ...
- git tool
1. install apt-get install git 2. 使用 ssh-keygen -C "email" -t rsa 生成一个ssh pub key,将生成的id_ ...
- 未能加载文件或程序集 Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad
没有 microsoft.web.infrastructure.dll 文件. 解决方式: ,第一种:在所发布的项目文件里面的 bin 文件目录下,添加 microsoft.web.infrastru ...
- mybatis与 Exception
mybatis将所有的异常全部包成了运行时异常,减少在高层代码中频繁的try-catch导致的代码臃肿问题.Persistence是它们共有的父类,继承自RuntimeException非检查型异常. ...
- .NET(C#)中的DataSet、string、DataTable等对象转换成Json
ConvertJson.cs类 using System; using System.Collections.Generic; using System.Text; using System.Data ...