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分页功能的更多相关文章

  1. C# Winform DataGridView分页功能的实现

    // 1.定义几个所需的公有成员: ; //每页显示行数 ; //总记录数 ; //页数=总记录数/每页显示行数 ; //当前页号 ; //当前记录行 DataSet ds = new DataSet ...

  2. C# 实现DataGridView分页功能

    C#实现DataGridView分页功能 2010-07-17 13:45:42|  分类: C#|字号 订阅     从界面可以看到,在设计时需要一个DataGridView.BindingNavi ...

  3. C# datagridview分页功能

    winform开发是或多或少都会接触datagridview控件,如果数据量大,那么必须使用分页功能,但是datagridview自身并没有分页,所以我们要自己实现.在网上搜了一些发现没有太适合自己的 ...

  4. 创建有输出参数的存储过程并在c#中实现DataGridView分页功能

    不足之处,欢迎指正! 创建有输出参数的存储过程 if exists(select * from sysobjects where name='usp_getPage1') drop procedure ...

  5. winform中DataGridView实现分页功能

    WinForm轻松实现自定义分页 (转载) WinForm轻松实现自定义分页 (转载)   转载至http://xuzhihong1987.blog.163.com/blog/static/26731 ...

  6. DataGridView使用BindingNavigator实现简单分页功能

    接上一篇<DataGridView使用自定义控件实现简单分页功能>,本篇使用BindingNavigator来实现简单分页功能.其实也只是借用了一个BindingNavigator空壳, ...

  7. winform里dataGridView分页代码,access数据库

    winform里dataGridView分页,默认dataGridView是不分页的和webform里不一样,webform中GridView自带自带了分页. 现在c/s的程序很多时候也需要webfo ...

  8. 简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一

    简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一 分页非为前端分页  和 后端分页,前端分页只有适用于B/S,B/S的呈现速度远远不如C/S,而C/S则没有这个问题,所以分页必然是 ...

  9. C#实现WinForm DataGridView控件支持叠加数据绑定

    我们都知道WinForm DataGridView控件支持数据绑定,使用方法很简单,只需将DataSource属性指定到相应的数据源即可,但需注意数据源必须支持IListSource类型,这里说的是支 ...

随机推荐

  1. Longest Increasing Subsequence

    很久不写算法了== 写个东西练练手 最长上升子序列 输入n,然后是数组a[ ]的n个元素 输出最长上升子序列的长度 一.最简单的方法复杂度O(n * n) DP[ i ] 是以a[ i ] 为结尾的最 ...

  2. 「LINUX资料」基础命令概览(一)

  3. 【OPENGL】第二篇 HELLO OPENGL(续)

    上一次我们在这里分析了OpenGL的例子,但是最后还少分析最重要的部分:着色器相关的代码.因此这一次作为前一篇文章的续集. 上一篇文章的地址 http://www.cnblogs.com/MyGame ...

  4. Could not load type from string value 'DALMSSQL.DBSessionFactory,DALMSSQL'.

    问题: 原因: DAL.dll不在程序目录下        --调了老半天.

  5. 关于C语言的一些trick

    很多东西已经记不起来了,想到一点写一点,碰到一点写一点,慢慢累积. 关于# #在宏定义中用于替换传入变量的字符,例如: #define whole_operation(n)  do { printf( ...

  6. PostgreSQL的权限查询

    查看哪些用户对表sns_log_member_b_aciton有哪些权限: sns_log=> \z sns_log_member_b_aciton Access privileges Sche ...

  7. ApiResponse 在 Swagger 1 和Swagger 2中的不同

    在1中随意写code , 在 2中 会提示 com.google.common.util.concurrent.UncheckedExecutionException: java.lang.Illeg ...

  8. install Hadoop

    Installing Java Hadoop runs on both Unix and Windows operating systems, and requires Java to beinsta ...

  9. 根据Request获取客户端IP 内网IP及外网IP

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实 ...

  10. Unable to create Azure Mobile Service: Error 500

    I had to go into my existing azure sql database server and under the configuration tab select " ...