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

实现原理和代码与上一篇几乎一样,实现方法如下:

 1、新建一个WinForm程序,命名为BindingNavigatorMain,并拖入一个DataGridView控件及一个BindingNavigator控件。在BindingNavigator右下角弹窗中添加

一个Button(转到),BindingNavigator的样式如下:

2、BindingNavigatorMain的代码如下:

        private int pageSize;   //每页显示记录数
private int pageIndex; //页序号
private int totalCount; //总记录数
private int pageCount; //总页数 public BindingNavigatorMain()
{
InitializeComponent();
} private void BindingNavigatorMain_Load(object sender, EventArgs e)
{
pageSize = ;
pageIndex = ;
SetPage();
} //设置页
private void SetPage()
{
//总记录数
totalCount = ;
BindPage(pageSize, pageIndex + , out totalCount); //总页数
if (totalCount % pageSize == )
pageCount = totalCount / pageSize;
else
pageCount = totalCount / pageSize + ; //当前页及总页数
txtCurrentPage.Text = (pageIndex + ).ToString();
lblTotalPage.Text = "共 " + pageCount.ToString() + " 页"; //BindingNavigator数据源不进行BindingSource赋值,但恢复控件可用性。
bindingNavigatorMoveFirstItem.Enabled = true;
bindingNavigatorMovePreviousItem.Enabled = true;
txtCurrentPage.Enabled = true;
lblTotalPage.Enabled = true;
bindingNavigatorMoveNextItem.Enabled = true;
bindingNavigatorMoveLastItem.Enabled = true;
} /// <summary>
/// 绑定页
/// </summary>
/// <param name="pageSize">每页显示记录数</param>
/// <param name="pageIndex">页序号</param>
/// <param name="totalCount">总记录数</param>
private void BindPage(int pageSize, int pageIndex, out int totalCount)
{
SqlConnection conn = null;
SqlCommand cmd = null;
totalCount = ; #region 连接数据库测试
try
{
//数据库连接
conn = new SqlConnection("server=.;database=DB_TEST;Uid=sa;pwd=********;");
conn.Open(); //SqlCommand
cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "PageTest";
cmd.CommandType = CommandType.StoredProcedure; SqlParameter[] param =
{
new SqlParameter("@PageSize",SqlDbType.Int),
new SqlParameter("@PageIndex",SqlDbType.Int),
new SqlParameter("@TotalCount",SqlDbType.Int)
};
param[].Value = pageSize;
param[].Value = pageIndex;
param[].Direction = ParameterDirection.Output;
cmd.Parameters.AddRange(param); //DataTable
DataTable dt = new DataTable("MF_MO");
dt.Columns.Add(new DataColumn("MO_NO", typeof(String)));
dt.Columns.Add(new DataColumn("MRP_NO", typeof(String)));
dt.Columns.Add(new DataColumn("QTY", typeof(Decimal)));
dt.Columns.Add(new DataColumn("BIL_NO", typeof(String))); #region 方法一:SqlDataReader
SqlDataReader dr = cmd.ExecuteReader();
dt.Load(dr, LoadOption.PreserveChanges);
dr.Close();
totalCount = (int)param[].Value;
dataGridView1.DataSource = dt;
#endregion #region #方法二:SqlDataAdapter
//SqlDataAdapter da = new SqlDataAdapter();
//da.SelectCommand = cmd;
//dt.BeginLoadData();
//da.Fill(dt);
//dt.EndLoadData();
//totalCount = (int)param[2].Value;
//dataGridView1.DataSource = dt;
#endregion
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
finally
{
conn.Close();
cmd.Dispose();
}
#endregion
} /// <summary>
/// 首页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bindingNavigatorMoveFirstItem_Click(object sender, EventArgs e)
{
pageIndex = ;
SetPage();
} /// <summary>
/// 上一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bindingNavigatorMovePreviousItem_Click(object sender, EventArgs e)
{
pageIndex--;
if (pageIndex < )
{
pageIndex = ;
}
SetPage();
} /// <summary>
/// 下一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bindingNavigatorMoveNextItem_Click(object sender, EventArgs e)
{
pageIndex++;
if (pageIndex > pageCount - )
{
pageIndex = pageCount - ;
}
SetPage();
} /// <summary>
/// 末页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bindingNavigatorMoveLastItem_Click(object sender, EventArgs e)
{
pageIndex = pageCount - ;
SetPage();
} /// <summary>
/// 只能按0-9、Delete、Enter、Backspace键
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtCurrentPage_KeyPress(object sender, KeyPressEventArgs e)
{
if ((e.KeyChar >= && e.KeyChar <= ) || e.KeyChar == || e.KeyChar == || e.KeyChar == )
{
e.Handled = false;
if (e.KeyChar == )
{
Go();
}
}
else
{
e.Handled = true;
}
} /// <summary>
/// 指定页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGo_Click(object sender, EventArgs e)
{
Go();
} private void Go()
{
if (string.IsNullOrEmpty(txtCurrentPage.Text))
{
MessageBox.Show("指定页不能为空。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtCurrentPage.Focus();
return;
} if (int.Parse(txtCurrentPage.Text) > pageCount)
{
MessageBox.Show("指定页已超过总页数。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtCurrentPage.Focus();
return;
} pageIndex = int.Parse(txtCurrentPage.Text) - ;
SetPage();
}

3、SQL Server创建存储过程PageTest:

CREATE PROCEDURE [dbo].[PageTest]
@PageSize INT,
@PageIndex INT,
@TotalCount INT OUTPUT
AS
BEGIN
--总记录数
SELECT @TotalCount=COUNT(1) FROM MF_MO --记录返回(使用动态SQL绕开参数嗅探问题,效率大幅度提升。)
DECLARE @SQL NVARCHAR(1000)
SET @SQL=
'SELECT TOP ('+CONVERT(VARCHAR(32),@PageSize)+') MO_NO,MRP_NO,QTY,BIL_NO '+
'FROM MF_MO A '+
'WHERE NOT EXISTS (SELECT 1 FROM (SELECT TOP ('+CONVERT(VARCHAR(32),(@PageIndex-1)*@PageSize)+') MO_NO FROM MF_MO ORDER BY MO_NO) B WHERE A.MO_NO=B.MO_NO) '+
'ORDER BY MO_NO'
EXEC (@SQL)
END

4、执行程序:

好了,分享就到此结束了,希望对有此需要的人有一些帮助。

DataGridView使用BindingNavigator实现简单分页功能的更多相关文章

  1. DataGridView使用自定义控件实现简单分页功能

    本例子使用自定义控件方法实现,数据库使用的是SQL Server,实现过程如下: 1.新建一个自定义控件,命名为:PageControl. 2.PageControl代码如下: public part ...

  2. jQuery实现的简单分页功能的详细解析

    分页功能在项目开发中不可或缺,老司机操作起来就和呼吸一样简单,新手恐怕就会吃力一些. 今天我回顾了一下具体的操作步骤,决定详细的分析一下每一步的实现目的及原理. 我们会创建一个简单的json文件来模拟 ...

  3. Django实现简单分页功能

    使用django的第三方模块django-pure-pagination 安装模块: pip install django-pure-pagination 将'pure_pagination'添加到s ...

  4. winform中DataGridView实现分页功能

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

  5. 简单封装分页功能pageView.js

    分页是一个很简单,通用的功能.作为一个有经验的前端开发人员,有义务把代码中类似这样公共的基础性的东西抽象出来,一来是改善代码的整体质量,更重要的是为了将来做类似的功能或者类似的项目,能减少不必要的重复 ...

  6. 利用Bootstrap Paginator插件和KnockoutJS完成分页功能

    在最近一个项目中,需要结合一堆条件查询并对查询的结果数据完成一个简单分页功能,可是做着做着,自己的思路越来越模糊,做到心态崩溃!!! 哈哈,特此花点时间重新总结,并从最简单的分页,然后向多条件查询分页 ...

  7. MVC001之mvcpager简单分页

    描述:用mvcpager实现简单分页功能 参考网址: http://www.cnblogs.com/iamlilinfeng/archive/2013/03/11/2951460.html http: ...

  8. C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi

    C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...

  9. php对文本文件进行分页功能简单实现

    php对文本文件进行分页功能简单实现 <!DOCTYPE> <html> <head> <meta http-equiv="Content-type ...

随机推荐

  1. 你知道,HTTPS用的是对称加密还是非对称加密?

    1.引言 随着互联网安全意识的普遍提高,对安全要求稍高的应用中,HTTPS的使用是很常见的,甚至在1年前,苹果公司就将使用HTTPS作为APP上架苹果应用市场的先决条件之一(详见<苹果即将强制实 ...

  2. Python中的Tcp协议的应用之Tcp服务端程序开发

    TCP通信协议是面向连接的可靠的网络通信协议. 网络间想要进行数据传输必须要用到socket,socket翻译过来叫做套接字,其主要作用是不同设备或同一台设备之间的进程通信工具. Python中的Tc ...

  3. AutoLayout的那些事儿

    转自:http://www.cocoachina.com/ios/20160530/16522.html 本文投稿文章,作者:MangoMade(简书) AutoLayout非常强大也非常易用,可读性 ...

  4. PlantUML Viewer Chrome 插件 画时序图

    PlantUML通过简单直观的语言来定义示意图 使用 Chrome+ PlantUML Viewer的插件画图 1,打开chrome网上应用店 2,搜索plantuml viewer 并添加 3,扩展 ...

  5. 史上最全的iptables应用

    第14章 防火墙的使用 14.1 防火墙的概念 将不安全的网络流量信息进行隔离 14.2 防火墙的实现 14.2.1 硬件实现 思科,华为防火墙服务器 14.2.2 软件实现 iptables(cen ...

  6. Day 03 Python 基础

    目录 Pycharm 的使用 设置 快捷键 变量 什么是变量 定义变量 变量名的命名规则 变量名的两种命名方式 注释 快捷键(快速注释) 单行注释 多行注释 注释的作用 Turtle库的使用 Pych ...

  7. 回归损失函数2 : HUber loss,Log Cosh Loss,以及 Quantile Loss

    均方误差(Mean Square Error,MSE)和平均绝对误差(Mean Absolute Error,MAE) 是回归中最常用的两个损失函数,但是其各有优缺点.为了避免MAE和MSE各自的优缺 ...

  8. Fusion360_Generative Design 入门学习笔记

    2019.12.17更新 初次见到衍生式设计的时候感觉非常惊艳,现在觉得这个功能就是个弟弟,只能做一些中看不中用的东西.这个方法的理论基础是拓扑优化,想做research的同学可参阅"如何入 ...

  9. Redis sorted set 常用命令介绍

    Redis sorted set 使用: Redis 有序集合(sorted set) Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个 ...

  10. 了解web漏洞-sql注入

    1:为什么要学web漏洞? 作为一个运维人员,日常工作就是保障服务器和网站的业务正常运行,平时也需要对服务器的安全工作加固,说到防护攻击问题,那么久必须去了解攻击者是怎么对服务器发动的一个流程,这样才 ...