【干货】再上数据分页控件 ━ 更加灵活,更加实用-提供源码

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/42393595 再上数据分页控件-更加灵活,更加实用   关于数据分页的文章太多了,各有各的一套方案,但大多都很类似,要么使用存储过程,要么直接使用代码进行分页。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/42393595

再上数据分页控件-更加灵活,更加实用 

  关于数据分页的文章太多了,各有各的一套方案,但大多都很类似,要么使用存储过程,要么直接使用代码进行分页。各种方案分页的效率也不尽相同,我们不一定要找一个最高效的(根据实际的项目情况),找一个最合适的就OK了。下面我要谈的分页控件非常灵活,可以支持任意类型的数据库,同时可以支持存储过程或代码分页(会自动判断),也支持多表的分页,非常的方便。对于数据分页的相关文章,在我的博客中可以找到很多,下面我做一个简单的汇总,方便大家查阅。 

1、 原创企业级控件库之大数据量分页控件

2、 再上数据分页控件(不用存储过程)

3、 RDIFramework.NET 中多表关联查询分页实例

  下面要给大家分享的分页控件只做分页的处理,不做与数据库相关的操作。直接提供分页的数据给分页控件即可。它不关心你的数据来源是什么,也不关心你采用的数据分页的方式(存储过程或代码等)。这个分页控件我取名为:UcPagerEx,如下图所示:

 

  实现分页控件的代码非常的简单,下面直接给出全部源码,大家可以参考下,整个分页控件的源码如下:

using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace RDIFramework.Controls
{
    public delegate void PageChangedEventHandler(object sender, EventArgs e);
    /// <summary>
    /// 分页用户控件,仅提供分页信息显示及改变页码操作
    /// </summary>
public partial class UcPagerEx : UserControl
{
        public event PageChangedEventHandler PageChanged;
        private int _pageSize;
        private int m_PageCount;
        private int _recordCount;
        private int _pageIndex;


        public UcPagerEx()
        {
            InitializeComponent();
            this._pageSize = 10;
            this._recordCount = 0;
            this._pageIndex = 1; //默认为第一页
        }
        /// <summary> 
        /// 带参数的构造函数
        /// <param name="pageSize">每页记录数</param>
        /// <param name="recordCount">总记录数</param>
        /// </summary>
        public UcPagerEx(int recordCount, int pageSize)
        {
            InitializeComponent();

            this._pageSize = pageSize;
            this._recordCount = recordCount;
            this._pageIndex = 1; //默认为第一页
            this.InitPageInfo();
        }
        protected virtual void OnPageChanged(EventArgs e)
        {
            if (PageChanged != null)
            {
                InitPageInfo();
                PageChanged(this, e);
            }
        }
        [Description("设置或获取一页中显示的记录数目"), DefaultValue(20), Category("分页")]
        public int PageSize
        {
            set
            {
                this._pageSize = value;
            }
            get
            {
                return this._pageSize;
            }
        }

        [Description("获取记录总页数"), DefaultValue(0), Category("分页")]
        public int PageCount
        {
            get
            {
                return this.m_PageCount;
            }
        }

        [Description("设置或获取记录总数"), Category("分页")]
        public int RecordCount
        {
            set
            {
                this._recordCount = value;
            }
            get
            {
                return this._recordCount;
            }
        }

        [Description("当前的页面索引, 开始为1"), DefaultValue(0), Category("分页")]
        [Browsable(false)]
        public int PageIndex
        {
            set
            {
                this._pageIndex = value;
            }
            get
            {
                return this._pageIndex;
            }
        }

        /// <summary> 
        /// 初始化分页信息
        /// <param name="pageSize">每页记录数</param>
        /// <param name="recordCount">总记录数</param>
        /// </summary>
        public void InitPageInfo(int recordCount, int pageSize)
        {
            this._recordCount = recordCount;
            this._pageSize = pageSize;
            this.InitPageInfo();
        }

        /// <summary> 
        /// 初始化分页信息
        /// <param name="recordCount">总记录数</param>
        /// </summary>
        public void InitPageInfo(int recordCount)
        {
            this._recordCount = recordCount;
            this.InitPageInfo();
        }
        /// <summary> 
        /// 初始化分页信息
        /// </summary>
        public void InitPageInfo()
        {
            if (this._pageSize < 1)
                this._pageSize = 10; //如果每页记录数不正确,即更改为10
            if (this._recordCount < 0)
                this._recordCount = 0; //如果记录总数不正确,即更改为0

            //取得总页数
            if (this._recordCount % this._pageSize == 0)
            {
                this.m_PageCount = this._recordCount / this._pageSize;
            }
            else
            {
                this.m_PageCount = this._recordCount / this._pageSize + 1;
            }

            //设置当前页
            if (this._pageIndex > this.m_PageCount)
            {
                this._pageIndex = this.m_PageCount;
            }
            if (this._pageIndex < 1)
            {
                this._pageIndex = 1;
            }

            //设置上一页按钮的可用性
            bool enable = (this.PageIndex > 1);
            this.btnPrevious.Enabled = enable;

            //设置首页按钮的可用性
            enable = (this.PageIndex > 1);
            this.btnFirst.Enabled = enable;

            //设置下一页按钮的可用性
            enable = (this.PageIndex < this.PageCount);
            this.btnNext.Enabled = enable;

            //设置末页按钮的可用性
            enable = (this.PageIndex < this.PageCount);
            this.btnLast.Enabled = enable;
            this.txtPageIndex.Text = this._pageIndex.ToString();
            this.lblPageInfo.Text = string.Format("共 {0} 条记录,每页 {1} 条,共 {2} 页", this._recordCount, this._pageSize, this.m_PageCount);
        }

        public void RefreshData(int page)
        {
            this._pageIndex = page;
            EventArgs e = new EventArgs();
            OnPageChanged(e);
        }

        private void btnFirst_Click(object sender, System.EventArgs e)
        {
            this.RefreshData(1);
        }

        private void btnPrevious_Click(object sender, System.EventArgs e)
        {
            if (this._pageIndex > 1)
            {
                this.RefreshData(this._pageIndex - 1);
            }
            else
            {
                this.RefreshData(1);
            }
        }
        private void btnNext_Click(object sender, System.EventArgs e)
        {
            if (this._pageIndex < this.m_PageCount)
            {
                this.RefreshData(this._pageIndex + 1);
            }
            else if (this.m_PageCount < 1)
            {
                this.RefreshData(1);
            }
            else
            {
                this.RefreshData(this.m_PageCount);
            }
        }

        private void btnLast_Click(object sender, System.EventArgs e)
        {
            this.RefreshData(this.m_PageCount > 0 ? this.m_PageCount : 1);
        }

        private void txtPageIndex_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                int num;
                try
                {
                    num = Convert.ToInt16(this.txtPageIndex.Text);
                }
                catch
                {
                    num = 1;
                }

                if (num > this.m_PageCount)
                    num = this.m_PageCount;
                if (num < 1)
                    num = 1;

                this.RefreshData(num);
            }
        }
    }
}

代码基本没有什么难度,相信大家都能看得懂,那么如何使用这个控件呢?

  首先在生成的工具箱中拖动这个分页控件到界面上,再后再做数据绑定的代码即可。我直接展示一个已经做成的界面,如下图所示:

上面就是分页的效果,如何实现的呢?下面给出实现代码。

  我们可以在Load事件中调用下面的Search()方法对数据进行绑定,如下代码所示:

private void Search()
{
    var recordCount = 0;            
    this.DTProductInfo = GetData(out recordCount, ucPager.PageIndex, ucPager.PageSize, this.searchValue);
    ucPager.RecordCount = recordCount;
    ucPager.InitPageInfo();
    // 加载绑定数据
    this.GetList();
}

private DataTable GetData(out int recordCount, int pageIndex, int pageSize,string search)
{
    return new ProductInfoManager(dbProvider).GetDTByPage(out recordCount, pageIndex, pageSize, search,ProductInfoTable.FieldCreateOn + " DESC ");
}

public override void GetList()
{
    this.dgvProductInfo.AutoGenerateColumns = false;
    if (this.DTProductInfo.Columns.Count > 0)
    {
        this.DTProductInfo.DefaultView.Sort = ProductInfoTable.FieldCreateOn;
    }

    this.dgvProductInfo.DataSource = this.DTProductInfo.DefaultView;
    this.SetControlState();
}
   同时需要对UcPagerEx的PageChanged事件做处理,以启用用户分页的需求,代码如下:

private void ucPager_PageChanged(object sender, EventArgs e)
{
    var holdCursor = this.Cursor;
    this.Cursor = Cursors.WaitCursor;
    Search();
    this.Cursor = holdCursor;
}

附注:对于上面的“GetDTByPage”方法可以任意实现,可以调用存储过程,也可以使用代码进行分页。只要返回分页的数据即可。

  下面给出一些分页的效果,如下图所示:

 


作者: EricHu 
出处:http://blog.csdn.net/chinahuyong  
Email:406590790@qq.com 
QQ交流:406590790 
QQ群:237326100 
框架博客:http://blog.csdn.net/chinahuyong 
               http://www.cnblogs.com/huyong
RDIFramework.NET,基于.NET的快速信息化系统开发、整合框架,给用户和开发者最佳的.Net框架部署方案。 
关于作者:高级工程师、信息系统项目管理师、DBA。专注于微软平台项目架构、管理和企业解决方案,多年项目开发与管理经验,曾多次组织并开发多个大型项目,在面向对象、面向服务以及数据库领域有一定的造诣。现主要从事基于 RDIFramework.NET 框架的技术开发、咨询工作,主要服务于金融、医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。 
如有问题或建议,请多多赐教! 
本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过邮箱或QQ 联系我,非常感谢。

相关文章
|
4月前
|
C# 前端开发 UED
WPF数据验证实战:内置控件与自定义规则,带你玩转前端数据验证,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,数据验证是确保输入正确性的关键环节。前端验证能及时发现错误,提升用户体验和程序可靠性。本文对比了几种常用的WPF数据验证方法,并通过示例展示了如何使用内置验证控件(如`TextBox`)及自定义验证规则实现有效验证。内置控件结合`Validation`类可快速实现简单验证;自定义规则则提供了更灵活的复杂逻辑支持。希望本文能帮助开发者更好地进行WPF数据验证。
118 0
|
4月前
|
开发框架 前端开发 JavaScript
WPF应用开发之控件动态内容展示
WPF应用开发之控件动态内容展示
|
SQL 数据库
winform分页案例简单实现方式~
winform分页案例简单实现方式~
156 0
|
C# Windows
WPF DataGrid分页功能实现代码
在Silverlight中DataGrid分页可以结合DataPager控件很容易实现,但是在WPF中没有类似的,需要手动实现这样一个控件: 1、创建一个UserControl,DP.
1159 0
|
算法 数据库 内存技术
【视频】自然框架之分页控件的使用方法(一) PostBack方式的一般分页方式
前言:分页控件的优点   1、 按需所取 —— 需要几条记录就从数据库里提取几条记录,不会多取。 2、 使用简单 —— 设置几个属性就可以实现分页的功能。 3、 多种分页算法 —— (即分页用的SQL语句)可以根据不同的需求灵活选择 4、 支持多种数据库 —— 用不同的分页算法对应不同的数据库。
1113 0
【小试身手】几个自定义控件的组合应用,实现简单的“增删改查”功能(有源码)
     分页控件、查询控件、显示数据的控件和表单控件,终于把这几个控件结合在一起了,和在一起之后就可以让“增删改查”变的非常的简单和容易了,当然还需要数据访问函数库的支持。      综合演示的IDE是 vs2008,.net Framework2.0,C#, B/S 。
1046 0
|
SQL .NET 数据库
|
存储 开发框架 .NET