原文:http://www.cnblogs.com/herbert/archive/2010/07/26/1785445.html

参考了许多的资料和不断地调试,总算把这个问题弄清楚了。实现了一个简单的分页示例,虽然这样的做法不是太好。

程序有3个控件

BindingNavigator: 就是DataGridView控件上面的那个,在工程里名字: bindngrDemo

DataGridView: dgvDemo

BindingSource: 这个其实可以不要 bindseDemo

示例采用的是SQL SERVER的示例数据库pub

在pub数据库里写入分页存储过程

CREATE PROCEDURE [dbo].[Pagination]
@Columns VARCHAR(500), -- The columns to be displayed, divide by comma
@Tablename VARCHAR(100), -- The name of the table to be searched
@OrderColumnName VARCHAR(100), -- The name of the column to be used in order
@Order VARCHAR(50), -- The order method, ASC or DESC
@Where VARCHAR(100), -- The where condition, if there is not conditon use 1=1
@PageIndex INT, -- Current page index
@PageSize INT, -- The size of the page
@PageCount INT OUTPUT -- The total page count,define as output parameter
AS
BEGIN
DECLARE @SqlRecordCount NVARCHAR(100) -- The SQL Statement to get the total count of the records
DECLARE @SqlSelect NVARCHAR(1000) -- The SQL SELECT statment
SET @SqlRecordCount = N'SELECT @RecordCount = COUNT(*) FROM ' + @Tablename + ' WHERE ' +@Where
DECLARE @RecordCount INT
EXEC sp_executesql @SqlRecordCount, N'@RecordCount INT OUTPUT',@RecordCount OUTPUT -- Transfer the parameter dynamicIF(@RecordCount % @PageSize = 0)
SET @PageCount = @RecordCount / @PageSize
ELSE
SET @PageCount = @RecordCount / @PageSize + 1SET @SqlSelect = N'SELECT ' + @Columns + ' FROM(SELECT ROW_NUMBER() OVER (ORDER BY ' + @OrderColumnName+' ' + @Order + ') AS tempid, * FROM ' + @Tablename + ' WHERE ' + @Where + ') AS tempTableName WHERE tempidBETWEEN ' + STR((@PageIndex - 1)*@PageSize + 1) + ' AND ' + STR(@PageIndex * @PageSize)
EXEC(@SqlSelect)
END

下面的就是VS里的代码了:

在工程里定义几个变量:

 public partial class frmDataPagination : Form{#region Define the page sizestatic int pageSize = 20;static int pageCount = 0;#endregion...}

上面2个变量,一个定义在数据库里分页时,每页的大小; 另一个用来接收存储过程分页时,输出的总页数。

在里面加入一个产生Select命令的函数,用于向sqlDataAdapter传递sql command.

        private static SqlCommand GenerateSelectCommand(string Columns, string tableName, string orderColumnName, string order, string whereCondition,int pageIndex, int pageSize, SqlConnection conn){SqlCommand sqlcmd = new SqlCommand("Pagination", conn);sqlcmd.CommandType = CommandType.StoredProcedure;sqlcmd.Parameters.AddWithValue("@Columns", Columns);                    sqlcmd.Parameters.AddWithValue("@Tablename", tableName);sqlcmd.Parameters.AddWithValue("@OrderColumnName", orderColumnName);sqlcmd.Parameters.AddWithValue("@Order", order);sqlcmd.Parameters.AddWithValue("@Where", whereCondition);sqlcmd.Parameters.AddWithValue("@PageIndex", pageIndex);sqlcmd.Parameters.AddWithValue("@PageSize", pageSize);SqlParameter pageCount = new SqlParameter("@PageCount", SqlDbType.Int);            pageCount.Direction = ParameterDirection.Output;sqlcmd.Parameters.Add(pageCount);             sqlcmd.UpdatedRowSource = UpdateRowSource.None;return sqlcmd;}

下面是LoadData函数, 在这个函数里面可以指定自己要选的table 以及列等等参数

里面有2种数据绑定

可以直接用sql command + Sql datareader

也可以sqldataAdapter + Dataset 或者Datatable

        // Load the page dataprivate static void LoadData(int pageIndex, DataGridView dgvDemo){string strConn = "server = (local); Database = pubs; Integrated Security = SSPI";try{using (SqlConnection conn = new SqlConnection(strConn)){conn.Open();   // Use sqlcommand to fetch the data/*
                    SqlCommand cmd = GenerateSelectCommand("fname", "employee", "fname", "ASC", "1=1", pageIndex, pageSize, conn);
                    SqlDataReader rdr = cmd.ExecuteReader();
                    BindingSource bindseDemo = new BindingSource();
                    bindseDemo.DataSource = rdr;
                    dgvDemo.DataSource = bindseDemo;
                    */// Use SqlDataAdapter to fetch the data                 SqlDataAdapter sqlDa = new SqlDataAdapter();                  sqlDa.SelectCommand = GenerateSelectCommand("fname, lname, hire_date", "employee", "fname", "ASC", "1=1", pageIndex, pageSize, conn);DataTable ds = new DataTable();sqlDa.Fill(ds);pageCount = (int)sqlDa.SelectCommand.Parameters["@PageCount"].Value;                    BindingSource bindseDemo = new BindingSource();bindseDemo.DataSource = ds;dgvDemo.DataSource = bindseDemo;sqlDa.Dispose();                  // Use SqlDataAdapter Dataset to fetch the data/*
                    DataSet ds = new DataSet();
                    SqlDataAdapter sqlDa = new SqlDataAdapter();
                    sqlDa.SelectCommand = GenerateSelectCommand("fname", "employee", "fname", "ASC", "1=1", pageIndex, pageSize, conn);
                    sqlDa.Fill(ds);
                    pageCount = (int)sqlDa.SelectCommand.Parameters["@PageCount"].Value;
                    dgvDemo.DataSource = ds.Tables[0];
                    sqlDa.Dispose();
                    */conn.Close();}}catch (Exception ex){MessageBox.Show(ex.Message, "Information:", MessageBoxButtons.OK, MessageBoxIcon.Information);}}

窗体Load的代码

private void frmDataPagination_Load(object sender, EventArgs e){// Even if there is no records, there is no exception            LoadData(1, dgvDemo);// Set the status of the BindingNavigator controlif (pageCount == 0 || pageCount == 1){bindngrDemo.MoveFirstItem.Enabled = false;bindngrDemo.MoveLastItem.Enabled = false;bindngrDemo.MoveNextItem.Enabled = false;bindngrDemo.MovePreviousItem.Enabled = false;}else{bindngrDemo.MoveFirstItem.Enabled = false;bindngrDemo.MoveLastItem.Enabled = true;bindngrDemo.MoveNextItem.Enabled = true;bindngrDemo.MovePreviousItem.Enabled = false;bindngrDemo.PositionItem.Text = "1";bindngrDemo.CountItem.Text = "of {" + pageCount.ToString() + "}";}    }

BindingNavigator控件的几个事件

包括4个键

向后,最后,向前,最前

        private void bindingNavigatorMoveNextItem_Click(object sender, EventArgs e){int currentPage = Convert.ToInt32(bindngrDemo.PositionItem.Text);if (currentPage < pageCount){int page = currentPage + 1;bindngrDemo.PositionItem.Text = page.ToString();LoadData(page, dgvDemo);if (page == pageCount){bindngrDemo.MoveNextItem.Enabled = false;bindngrDemo.MoveLastItem.Enabled = false; }if (page >= 2){bindngrDemo.MovePreviousItem.Enabled = true;bindngrDemo.MoveFirstItem.Enabled = true; }                    }else{                MessageBox.Show("This is the last page", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);                   }}private void bindingNavigatorMovePreviousItem_Click(object sender, EventArgs e){int currentPage = Convert.ToInt32(bindngrDemo.PositionItem.Text);if (currentPage >= 2){int page = currentPage - 1;bindngrDemo.PositionItem.Text = page.ToString();LoadData(page, dgvDemo);if (page == 1){bindngrDemo.MovePreviousItem.Enabled = false;bindngrDemo.MoveFirstItem.Enabled = false;}if (page <= pageCount){bindngrDemo.MoveNextItem.Enabled = true;bindngrDemo.MoveLastItem.Enabled = true;}}else{MessageBox.Show("This is the first page", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);}}private void bindingNavigatorMoveLastItem_Click(object sender, EventArgs e){LoadData(pageCount, dgvDemo);bindngrDemo.PositionItem.Text = pageCount.ToString();bindngrDemo.MoveLastItem.Enabled = false;bindngrDemo.MoveNextItem.Enabled = false;bindngrDemo.MovePreviousItem.Enabled = true;bindngrDemo.MoveFirstItem.Enabled = true;}private void bindingNavigatorMoveFirstItem_Click(object sender, EventArgs e){LoadData(1, dgvDemo);bindngrDemo.PositionItem.Text = "1";bindngrDemo.MoveFirstItem.Enabled = false;bindngrDemo.MovePreviousItem.Enabled = false;bindngrDemo.MoveNextItem.Enabled = true;bindngrDemo.MoveLastItem.Enabled = true;}}

至此就全部完了,里面其他的部分就由自己编写了,比如DataGridView控件的显示等等

转载于:https://www.cnblogs.com/ColdFish_Pegasus/archive/2011/02/16/1955873.html

(转)关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现相关推荐

  1. 关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现

    程序有3个控件 BindingNavigator: 就是DataGridView控件上面的那个,在工程里名字: bindngrDemo DataGridView: dgvDemo BindingSou ...

  2. WinForm之中BindingNavigator控件的使用

    在微软WinForm中,BindingNavigator控件主要用来绑定数据.可以将一个数据集合与该控件绑定,以进行数据联动的显示效果.如图下图所示: 那么,下面我们就来用BindingNavigat ...

  3. BindingNavigator控件

    WinForm之中BindingNavigator控件的使用 在微软WinForm中,BindingNavigator控件主要用来绑定数据.可以将一个数据集合与该控件绑定,以进行数据 联动的显示效果. ...

  4. 14. DataGridView数据控件

    DataGridView数据控件 开发WinForms应用程序需要使用数据库存储数据.使用DataGridView控件可以快速地将数据库中的数据显示给用户,并且可以通过DataGridView控件直接 ...

  5. [C#学习] BindingNavigator控件

    一 概述 BindingNavigator控件的用户界面 (UI) 由一系列 ToolStrip 按钮.文本框和静态文本元素组成,用于进行大多数常见的数据相关操作(如添加数据.删除数据和在数据中导航) ...

  6. pythongui界面实例带注释_python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例...

    PyQt5状态栏控件QStatusBar简介 MainWindow对象在底部保留有一个水平条,作为状态栏(QstatusBar),用于显示永久或临时的状态信息 QStatusBar类中的常用方法 方法 ...

  7. python表格控件_python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例...

    PyQt5表格控件QTableView简介 在通常情况下,一个应用需要和一批数据进行交互,然后以表格的形式输出这些信息,这时就需要用到QTableView类了,在QTableView中可以使用自定义的 ...

  8. python日历gui_python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例...

    PyQt5日期时间控件QDateTimeEdit介绍 QDateTimeEdit是一个允许用户编辑日期时间的控件,可以使用键盘上的上下键头按钮来增加或减少日期的时间值,QDateTimeEdit通过s ...

  9. qpython3可视图形界面_python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法...

    QWidget基本介绍 基础窗口控件QWidget类是所有用户界面对象的基类,所有的窗口或者控件都直接或者间接的继承自QWidget类. 窗口坐标系统 PyQt使用统一的坐标系统来定位窗口控件的位置和 ...

最新文章

  1. pytorch nn.LSTM()参数详解
  2. Python代码规范和命名规范
  3. keras 修仙笔记一
  4. [云炬创业学笔记]第一章创业是什么测试13
  5. 最小树形图+朱刘算法
  6. junit5和junit4_JUnit 5符合AssertJ
  7. 彻底解决zend studio 下 assignment in condition警告
  8. nfc 过滤 android,android-NFC意图过滤器= I / NfcDispatcher(923):连...
  9. echart旭日图_海报级设计感的旭日图,就在 ECharts 4.0
  10. 论文笔记:Composable Sparse Fine-Tuning for Cross-Lingual Transfer
  11. 为什么不要去外包公司?
  12. PostgreSQL中的索引—9(BRIN)
  13. 腾讯云服务器地域节点IP速度测试表
  14. 如何让RS485总线挂接更多数量的设备?
  15. 移动统计工具Flurry
  16. 计算机机房的网络属于,学校机房的网络属于()。
  17. pixhawk(PX4)的一些论坛网站(包括中文版的PX4用户手册和PX4开发手册)
  18. 趣图:新手 vs 老鸟
  19. m3u8中ts文件无损批量合并与转换方法
  20. 如何在WINDOWS下使用ZIP命令

热门文章

  1. 公共技术点之 Java 注解 Annotation
  2. 回首十年——写给还在各等级教育中盲目学习的人
  3. Vue首屏性能优化组件
  4. java 无锁框架_高性能无锁并发框架 Disruptor,太强了!
  5. python pip下载安装教程_python详细安装pip教程
  6. netflix linux_Netflix如何处理故障转移,Anaconda,Linux命令行技巧,Python日期时间库,GDPR,微服务等
  7. 区块链和加密货币产业_区块链:不仅仅用于加密货币
  8. 加入docker管理员_如何使系统管理员和开发人员同意Docker
  9. linux开源游戏_2014年杰出的开源和Linux游戏
  10. (49)移动端开发之流式布局(百分比布局)