C# Winform 分页功能的实现

首先创建一个用户控件 如下图 用到的控件 label、button、TextBox

内部代码如下

 #region 分页字段和属性

        private int pageIndex = 1;
        /// <summary>
        /// 当前页数
        /// </summary>
        public virtual int PageIndex
        {
            get { return pageIndex; }
            set { pageIndex = value; }
        }

        private int pageSize = 100;
        /// <summary>
        /// 每页记录数
        /// </summary>
        public virtual int PageSize
        {
            get { return pageSize; }
            set { pageSize = value; }
        }

        private int recordCount = 0;
        /// <summary>
        /// 总记录数
        /// </summary>
        public virtual int RecordCount
        {
            get { return recordCount; }
            set { recordCount = value; }
        }

        private int pageCount = 0;
        /// <summary>
        /// 总页数
        /// </summary>
        public int PageCount
        {
            get
            {
                if (pageSize != 0)
                {
                    pageCount = GetPageCount();
                }
                return pageCount;
            }
        }

        #endregion

        #region 页码变化时触发事件

        public event EventHandler OnPageChanged;

        #endregion
   #region 分页及相关事件功能实现

        /// <summary>
        /// 设窗体控件全部可用
        /// </summary>
        private void SetFormCtrEnabled()
        {
            linkFirst.Enabled = true;
            linkPrevious.Enabled = true;
            linkNext.Enabled = true;
            linkLast.Enabled = true;
            btnGo.Enabled = true;
        }

        /// <summary>
        /// 计算总页数
        /// </summary>
        /// <returns></returns>
        private int GetPageCount()
        {
            if (PageSize == 0)
            {
                return 0;
            }
            int pageCount = RecordCount / PageSize;
            if (RecordCount % PageSize == 0)
            {
                pageCount = RecordCount / PageSize;
            }
            else
            {
                pageCount = RecordCount / PageSize + 1;
            }
            return pageCount;
        }
        /// <summary>
        /// 用于客户端调用
        /// </summary>
        public void DrawControl(int count)
        {
            recordCount = count;
            DrawControl(false);
        }
        /// <summary>
        /// 根据不同的条件,改变页面控件的呈现状态
        /// </summary>
        private void DrawControl(bool callEvent)
        {

            lblCurrentPage.Text = PageIndex.ToString();
            lblPageCount.Text = PageCount.ToString();
            lblTotalCount.Text = RecordCount.ToString();
            txtPageSize.Text = PageSize.ToString();

            if (callEvent && OnPageChanged != null)
            {
                OnPageChanged(this, null);//当前分页数字改变时,触发委托事件
            }
            SetFormCtrEnabled();
            if (PageCount == 1)//有且仅有一页时
            {
                linkFirst.Enabled = false;
                linkPrevious.Enabled = false;
                linkNext.Enabled = false;
                linkLast.Enabled = false;
                btnGo.Enabled = false;
            }
            else if (PageIndex == 1)//当前页为第一页时
            {
                linkFirst.Enabled = false;
                linkPrevious.Enabled = false;
            }
            else if (PageIndex == PageCount)//当前页为最后一页时
            {
                linkNext.Enabled = false;
                linkLast.Enabled = false;
            }
        }

        #endregion

        #region 相关控件事件

        //首页按钮
        private void linkFirst_Click(object sender, EventArgs e)
        {
            PageIndex = 1;
            DrawControl(true);
        }

        //上一页按钮
        private void linkPrevious_Click(object sender, EventArgs e)
        {
            PageIndex = Math.Max(1, PageIndex - 1);
            DrawControl(true);
        }

        //下一页按钮
        private void linkNext_Click(object sender, EventArgs e)
        {
            PageIndex = Math.Min(PageCount, PageIndex + 1);
            DrawControl(true);
        }

        //尾页按钮
        private void linkLast_Click(object sender, EventArgs e)
        {
            PageIndex = PageCount;
            DrawControl(true);
        }

        /// <summary>
        /// 按下enter键,执行跳转页面功能
        /// </summary>
        private void txtPageNum_KeyPress(object sender, KeyPressEventArgs e)
        {
            btnGo_Click(null, null);
        }

        /// <summary>
        /// 跳转页数限制
        /// </summary>
        private void txtPageNum_TextChanged(object sender, EventArgs e)
        {
            int num = 0;
            if (int.TryParse(txtPageNum.Text.Trim(), out num) && num > 0)
            {   //TryParse 函数,将字符串转换成等效的整数,返回bool型,判断是否转换成功。
                //输入除数字以外的字符是转换不成功的

                if (num > PageCount)   //输入数量大于最大页数时,文本框自动显示最大页数
                {
                    txtPageNum.Text = PageCount.ToString();
                }
            }
        }

        /// <summary>
        /// 跳转按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGo_Click(object sender, EventArgs e)
        {
            int num = 0;
            if (int.TryParse(txtPageNum.Text.Trim(), out num) && num > 0)
            {
                PageIndex = num;
                DrawControl(true);
            }
        }

        #endregion
        bool isTextChanged = false;
        /// <summary>
        /// 每页显示的记录数改变时
        /// </summary>
        private void txtPageSize_TextChanged(object sender, EventArgs e)
        {
            int num = 0;
            //输入不符合规范时,默认设置为100
            if (!int.TryParse(txtPageSize.Text.Trim(), out num) || num <= 0)
            {
                num = 100;
                txtPageSize.Text = "100";
            }
            else
            {
                isTextChanged = true;

            }
            pageSize = num;
        }
        /// <summary>
        /// 光标离开 每页设置文本框时,显示到首页
        private void txtPageSize_Leave(object sender, EventArgs e)
        {
            if (isTextChanged)
            {
                isTextChanged = false;
                linkFirst_Click(null, null);
            }
        }

符合我的分页查询方法

 /// <summary>
        /// 通用分页查询方法
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="strColumns">查询字段名</param>
        /// <param name="strWhere">where条件</param>
        /// <param name="strOrder">排序条件</param>
        /// <param name="pageSize">每页数据数量</param>
        /// <param name="currentIndex">当前页数</param>
        /// <param name="recordOut">数据总量</param>
        /// <returns>DataTable数据表</returns>
        public static List<String[]> SelectPaging(string tableName, string strColumns, string strWhere, string strOrder, int pageSize, int currentIndex, out int recordOut)
        {
            List<String[]> res;
            recordOut = Convert.ToInt32(search(string.Format("select count(*) from {0} where{1}" ,tableName, strWhere))[0][0]);
            string pagingTemplate = "select {0} from {1} where {2} order by {3} limit {4} offset {5} ";
            int offsetCount = (currentIndex - 1) * pageSize;
            string commandText = String.Format(pagingTemplate, strColumns, tableName, strWhere, strOrder, pageSize.ToString(), offsetCount.ToString());
            res = search(commandText);
            return res;
        }

附上我修改前的分页查询方法

/// <summary>
        /// 通用分页查询方法
        /// </summary>
        /// <param name="connString">连接字符串</param>
        /// <param name="tableName">表名</param>
        /// <param name="strColumns">查询字段名</param>
        /// <param name="strWhere">where条件</param>
        /// <param name="strOrder">排序条件</param>
        /// <param name="pageSize">每页数据数量</param>
        /// <param name="currentIndex">当前页数</param>
        /// <param name="recordOut">数据总量</param>
        /// <returns>DataTable数据表</returns>
public static DataTable SelectPaging(string tableName, string strColumns, string strWhere, string strOrder, int pageSize, int currentIndex, out int recordOut)
        {
            DataTable dt = new DataTable();
            recordOut = Convert.ToInt32(ExecuteScalar( "select count(*) from " + tableName));
            string pagingTemplate = "select {0} from {1} where {2} order by {3} limit {4} offset {5} ";
            int offsetCount = (currentIndex - 1) * pageSize;
            string commandText = String.Format(pagingTemplate, strColumns, tableName, strWhere, strOrder, pageSize.ToString(), offsetCount.ToString());
            DataSet ds= ExecuteDataSet(commandText);
            dt = ds.Tables[0];
            return dt;
        }

两种使用方式

1、数据库查询

    private void pagerControl1_OnPageChanged(object sender, EventArgs e)
        {
            initData();
        }

   public CompanyData()
        {
            InitializeComponent();
            initData();
            //激活OnPageChanged事件
            pagerControl1.OnPageChanged += new EventHandler(pagerControl1_OnPageChanged);
        }

  private void initData()
        {

            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.Append(" 1=1 ");
            if (this.TbComName.Text != "")
            {
                stringBuilder.Append("and comName like '%" + this.TbComName.Text + "%'");
            }
            int RecordCount;
            List<String[]> res = DBHelper.SelectPaging("T_DM_COMPANY", " comId,comCode,comName,configureCode", stringBuilder.ToString(), " configureCode DESC ,comCode", pagerControl1.PageSize, pagerControl1.PageIndex, out RecordCount);

            List<Company> list = new List<Company>();
            for (int i = 0; i < res.Count; i++)
            {
                list.Add(new Company(res[i]));
            }
            pagerControl1.DrawControl(RecordCount);

            BindingSource bs = new BindingSource();
            bs.DataSource = list;
            this.CompanyDataDGW.DataSource = bs;
        }

2、文件读取数据 分页

  private void pagerControl1_OnPageChanged(object sender, EventArgs e)
        {
            Init();
        }
 public ProductionConfig()
        {
            InitializeComponent();
            Init();

            //激活OnPageChanged事件
            pagerControl1.OnPageChanged += new EventHandler(pagerControl1_OnPageChanged);
        }
  private void Init()
        {
            //获取template 中ip配置文件信息
            //String[] temIp = PropertiesGenerateUtil.getTemplate("template/ip.properties");
            int RecordCount;
            String[] temIp = PropertiesGenerateUtil.getTemplatePaging("template/ip.properties",pagerControl1.PageSize,pagerControl1.PageIndex,out RecordCount);
            List<entity.templateIp> templateIps = new List<entity.templateIp>();
            foreach (var item in temIp)
            {
                templateIps.Add(new entity.templateIp(item.Substring(0, item.IndexOf("="))));
            }

            pagerControl1.DrawControl(RecordCount);

            BindingSource bs = new BindingSource();
            bs.DataSource = templateIps;
            this.DGVTemplateIp.DataSource = bs;

        }
     /// <summary>
        /// 分页查询文件数据
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <param name="pageSize">每页数量</param>
        /// <param name="currentIndex">当前页数</param>
        /// <param name="recordOut">数据总量</param>
        /// <returns></returns>
        public static string[] getTemplatePaging(string path, int pageSize, int currentIndex, out int recordOut)
        {
            string[] str;
            recordOut = getTemplate(path).Count();
            using (StreamReader sr = new StreamReader(path))
            {
                string line;
                List<string> list = new List<string> { };
                // 1 0 1*100
                // 2 100 2*100
                int startingValue = (currentIndex - 1) * pageSize;//起始值
                int terminationValue = currentIndex * pageSize;//终止值
                int tempValue = 0;//计数器
                while ((line = sr.ReadLine()) != null)
                {
                    if (line.Contains("#"))//判断是注释跳出
                        continue;
                    if(tempValue>=startingValue&&tempValue< terminationValue)//判断是起始值添加
                        list.Add(line);
                    if (tempValue == terminationValue)//判断是终止值跳出
                        break;
                    tempValue++;
                }
                str = list.ToArray<String>();
            }
            return str;
        }

附上运行结果

到此这篇关于C# Winform 分页功能的实现的文章就介绍到这了,更多相关C# Winform 分页内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# winform分页查询的实现示例

    1.功能需求 本实例将通过c# winform实现简单的分页功能,需要的基础知识有SQL语句,c#语言基础以及c# winform的一些简单知识. 2.界面设计 这是一个简单的分页查询的界面,可以输入任意字段进行查询,这四个字段在数据准备会提到,整体界面如图1所示. 图1 中间显示是一个DataGridView,编辑好列和id,SortMode选择Automatic,意思是所有列自动铺满DataGridView,如图2所示. 图2 3.数据准备 本实例涉及到删查改,因此要有数据表以及对数据表进行

  • C# Winform 分页功能的实现

    首先创建一个用户控件 如下图 用到的控件 label.button.TextBox 内部代码如下 #region 分页字段和属性 private int pageIndex = 1; /// <summary> /// 当前页数 /// </summary> public virtual int PageIndex { get { return pageIndex; } set { pageIndex = value; } } private int pageSize = 100;

  • 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

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

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

  • Angularjs 实现分页功能及示例代码

    基于Angularjs实现分页 前言 学习任何一门语言前肯定是有业务需求来驱动你去学习它,当然ng也不例外,在学习ng前我第一个想做的demo就是基于ng实现分页,除去基本的计算思路外就是使用指令封装成一个插件,在需要分页的列表页面内直接引用. 插件 在封装分页插件时我实现了几种方式总体都比较零散,最后找到了一个朋友(http://www.miaoyueyue.com/archives/813.html)封装的插件,觉还不错,读了下他的源码就直接在项目中使用了. 原理和使用说明 1.插件源码主要

  • AngularJs实现分页功能不带省略号的代码

    angularJs 的分页重点体现在对 过滤器 的使用.这个过滤器也并不复杂. 首先上 html 代码: <!DOCTYPE html> <html ng-app="demoApp"> <head> <meta charset="utf-"> <meta name="viewport" content="width=device-width"> <title&g

  • thinkPHP5分页功能实现方法分析

    本文实例讲述了thinkPHP5分页功能实现方法.分享给大家供大家参考,具体如下: 其实分页自身的内容也不是很多.不过牵扯到样式的问题感觉挺烦.于是找到了分页类看了一下.把大体的结构说一下.如果有需要修改页面样式的可以自行修改样式.最好提前备份,防止意外. 首先是分页的调用,tp5的调用相对非常容易 $mod = new \app\index\model\Blogmsg(); $mo = $mod->paginate(1,14); $this->assign('list', $mo); //

  • php实现的后台表格分页功能示例

    本文实例讲述了php实现的后台表格分页功能.分享给大家供大家参考,具体如下: <?php //init.php $conn = mysqli_connect('127.0.0.1','root','','xz',3306); $sql = "SET NAMES UTF8"; mysqli_query($conn,$sql); $pagecount = 3; ?> user.php: <?php //用户管理 echo "用户管理<br/>&quo

  • Yii2.0小部件GridView(两表联查/搜索/分页)功能的实现代码

     GridView 两表联查/搜索/分页 当我们在一个网格视图中显示活动数据的时候,你可能会遇到这种情况,就是显示关联表的列的值,为了使关联列能够排序,你需要连接关系表,以及添加排序规则到数据提供者的排序组件中,对数据进行搜索,排序. Ⅰ.控制器层Controller <?php namespace backend\controllers; header("Content-type:text/html;charset=utf-8"); use Yii; use yii\web\C

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

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

随机推荐