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

上篇文章给大家介绍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 = 20;
   pageIndex = 0;
   SetPage();
  }
  //设置页
  private void SetPage()
  {
   //总记录数
   totalCount = 0;
   BindPage(pageSize, pageIndex + 1, out totalCount);
   //总页数
   if (totalCount % pageSize == 0)
    pageCount = totalCount / pageSize;
   else
    pageCount = totalCount / pageSize + 1;
   //当前页及总页数
   txtCurrentPage.Text = (pageIndex + 1).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 = 0;
   #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[0].Value = pageSize;
    param[1].Value = pageIndex;
    param[2].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[2].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 = 0;
   SetPage();
  }
  /// <summary>
  /// 上一页
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void bindingNavigatorMovePreviousItem_Click(object sender, EventArgs e)
  {
   pageIndex--;
   if (pageIndex < 0)
   {
    pageIndex = 0;
   }
   SetPage();
  }
  /// <summary>
  /// 下一页
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void bindingNavigatorMoveNextItem_Click(object sender, EventArgs e)
  {
   pageIndex++;
   if (pageIndex > pageCount - 1)
   {
    pageIndex = pageCount - 1;
   }
   SetPage();
  }
  /// <summary>
  /// 末页
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void bindingNavigatorMoveLastItem_Click(object sender, EventArgs e)
  {
   pageIndex = pageCount - 1;
   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 >= 48 && e.KeyChar <= 57) || e.KeyChar == 8 || e.KeyChar == 13 || e.KeyChar == 127)
   {
    e.Handled = false;
    if (e.KeyChar == 13)
    {
     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) - 1;
   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实现简单分页功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • WinForm中DataGridView折叠控件【超好看】

    刚到一家新公司,领导下发任务要用cs系统做一个表格折叠显示,这真是把我难倒了,自己工作6年一直以来都是做BS的系统.这如果在BS里面那太简单了,JqGrid默认都自带,可是DataGridview不支持折叠啊.自己一点经验没有,怎么办呢?于是上网搜了相关视频,资料,开始学习起来.最后借鉴源码封了这么一个东西,发出来分享下,也能让自己加深印象. 首先不多说,上图.如果大家感谢还不错,请继续往下阅读: 大概的效果就是这样. 上代码. 1.首先重写DataGridview,代码如下: public c

  • C#中DataGridView动态添加行及添加列的方法

    本文实例讲述了C#中DataGridView动态添加行及添加列的方法.分享给大家供大家参考.具体如下: Datagridview添加列: DataGridViewTextBoxColumn acCode = new DataGridViewTextBoxColumn(); acCode.Name = "acCode"; acCode.DataPropertyName = "acCode"; acCode.HeaderText = "A/C Code&quo

  • C# DataGridView绑定数据源的方法

    开始以前,先认识一下WinForm控件数据绑定的两种形式,简单数据绑定和复杂数据绑定. 1. 简单的数据绑定 例1 using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connStr"].ToString())) { SqlDataAdapter sda = new SqlDataAdapter("Select * From T_Class Where F_

  • C#实现3步手动建DataGridView的方法

    本文实例讲述了C#实现3步手动建DataGridView的方法.分享给大家供大家参考.具体如下: DataView dvCmControlInfo =  new  DataView(某个DataTable); 第一步 dataGridView1.Columns.Clear(); dataGridView1.AutoGenerateColumns = false ; dataGridView1.DataSource = dvCmControlInfo; //绑DataTable,DataSet,D

  • C#窗体控件DataGridView常用设置

    在默认情况下,datagridview的显示效果: 1.禁用最后一行空白. 默认情况下,最后一行空白表示自动新增行,对于需要在控件中进行编辑,可以保留 dataGridView1.AllowUserToAddRows = false; 上述禁用,仅是将用户界面交互的自动新增行禁了,但还是可以通过代码:dataGridView1.Rows.Add();来新增一行空白. 2.禁用'delete'键的删除功能. 默认情况,鼠标选中一整行,按 删除键 可以删除当前一整行 dataGridView1.Al

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

    上篇文章给大家介绍DataGridView使用自定义控件实现简单分页功能,本篇使用BindingNavigator来实现简单分页功能.其实也只是借用了一个BindingNavigator空壳, 实现原理和代码与上一篇几乎一样,实现方法如下: 1.新建一个WinForm程序,命名为BindingNavigatorMain,并拖入一个DataGridView控件及一个BindingNavigator控件.在BindingNavigator右下角弹窗中添加 一个Button(转到),BindingNa

  • DataGridView使用自定义控件实现简单分页功能(推荐)

    本例子使用自定义控件方法实现,数据库使用的是SQL Server,实现过程如下: 1.新建一个自定义控件,命名为:PageControl. 2.PageControl代码如下: public partial class PageControl : UserControl { //委托及事件 public delegate void BindPage(int pageSize, int pageIndex, out int totalCount); public event BindPage Bi

  • Django实现简单分页功能的方法详解

    本文实例讲述了Django实现简单分页功能的方法.分享给大家供大家参考,具体如下: 使用django的第三方模块django-pure-pagination 安装模块: pip install django-pure-pagination 将'pure_pagination'添加到settings.py文件中 INSTALLED_APPS = ( ... 'pure_pagination', ) 在view.py文件中 from django.shortcuts import render ro

  • Django框架实现的简单分页功能示例

    本文实例讲述了Django框架实现的简单分页功能.分享给大家供大家参考,具体如下: 前面一篇<Django开发的简易留言板>写了个简单的留言板,如果数据量太多的话在一页显示就不那么友好了,本文就是做一个分页显示. 代码在上一篇的基础上修改. 导入分页模块并修改views #只需修改index函数即可 from django.core.paginator import Paginator def index(request): messages = models.Message.objects.

  • JS实现的简单分页功能示例

    本文实例讲述了JS实现的简单分页功能.分享给大家供大家参考,具体如下: HTML部分: <body onLoad="goPage(1,10);"> <table id="idData" width="70%"> <tr><td>user2</td><td>25</td><td>男</td><td>山西吕梁</td>&

  • 通过 Django Pagination 实现简单分页功能

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 当博客上发布的文章越来越多时,通常需要进行分页显示,以免所有的文章都堆积在一个页面,影响用户体验. Django 内置的 Pagination 能够帮助我们实现简单的分页功能,在上一篇教程中我们使用脚本批量生成了几百篇博客文章,正好用于测试分页效果. Paginator 类的常用方法 分页功能由 Django 内置的 Paginator 类提供,这个类位于 django.core.

  • vue实现简单分页功能

    本文实例为大家分享了vue实现简单的分页功能的具体代码,供大家参考,具体内容如下 <template> <div id="pages">     <div class="pages">         <div class="classInfo" v-for="(item,index) in currentPageData" :key="index">    

  • Vue组件BootPage实现简单的分页功能

    有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋可以移步我的上一篇文章<浅谈Vue.js>了解一下. BootPage组件简介  其实也不是啥高大上的组件了,相反确实一个简单的表格分页组件而已,主要是自己最近项目中需要一个表格分页组件,而Vue官方组件库里分页组件都功能太强大或者没有适合我的,所以就自己写了一个凑合着用,或许有人和我一样需要这样

  • PHP简单实现数字分页功能示例

    本文实例讲述了PHP简单实现数字分页功能.分享给大家供大家参考,具体如下: <?php header ( 'Content-Type: text/html; charset=utf-8' ); //分页 $page=$_GET['page']; $allcount= 100; $page_size =10; $page_show =5; $page_count = ceil($allcount/$page_size); if($page <= 1 || $page == '') $page =

  • 详解Python odoo中嵌入html简单的分页功能

    在odoo中,通过iframe嵌入 html,页面数据则通过controllers获取,使用jinja2模板传值渲染 html页面分页内容,这里写了判断逻辑 <!-- 分页 --> <ul id="ty_paging"> <li class="home" id="home"><a href="/car/budget/report/1" rel="external nofoll

随机推荐