`

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

阅读更多

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

  关于数据分页的文章太多了,各有各的一套方案,但大多都很类似,要么使用存储过程,要么直接使用代码进行分页。各种方案分页的效率也不尽相同,我们不一定要找一个最高效的(根据实际的项目情况),找一个最合适的就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 
:237326100
平台博客: 【CSDN】http://blog.csdn.net/chinahuyong
         【CNBLOGS】http://www.cnblogs.com/huyong
关于作者:高级工程师、信息系统项目管理师、DBA。专注于微软平台项目架构、管理和企业解决方案,多年项目开发与管理经验,
曾多次组织并开发多个大型项目,精通DotNet,DB(SqlServer、Oracle等)技术。熟悉Java、Delhpi及Linux操作系统,有扎实的网络知识。
在面向对象、面向服务以及数据库领域有一定的造诣。现从事DB管理与开发、WinForm、WCF、WebService、网页数据抓取以及ASP.NET等项目管理、
开发、架构等工作。
如有问题或建议,请多多赐教!
本文版权归作者和CNBLOGS博客共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,
可以通过邮箱或QQ 联系我,非常感谢。

 

 

 

1
6
分享到:
评论
2 楼 chinahuyong 2015-01-07  
fypop 写道
分页也能上头条呀

老生常谈的问题呢!
1 楼 fypop 2015-01-07  
分页也能上头条呀

相关推荐

    node.js博客案例详细源码 干货干货干货

    这个"node.js博客案例详细源码 干货干货干货"项目,显然是一份使用Node.js开发个人博客系统的完整源代码,对于学习Node.js、Web开发以及数据库操作有着极高的实践价值。 首先,我们要理解Node.js的核心特性。Node....

    干货!8套H5 App完整源码!果断收藏!-附件资源.txt

    干货!8套H5 App完整源码!果断收藏!-附件资源.txt

    精品 干货 数据挖掘数据分析配套纯英文版教程课件 共10个章节 含配套数据源和源代码.rar

    共10个章节,由浅入深介绍数据挖掘算法,含配套数据源和源代码 10个章节信息如下: 精品 干货 数据挖掘数据分析配套纯英文版教程课件 chap1_intro 精品 干货 数据挖掘数据分析配套纯英文版教程课件 chap2_data 精品...

    12款实用的HTML5干货分享

    包含12款实用的HTML5实例源码:解压密码:icloudedu.org CSS3垂直图标菜单-带Tooltip提示框 CSS3多样式小图标按钮-带分享按钮 CSS3可视化网页编辑器-基于tinymce编辑器 ...12款实用的HTML5干货分享.rar

    【干货】linux-2.6.11.12内核源代码及源码注释.zip

    2.6.11.12内核源码解释了如何实现内存的分页、交换、内存分配器(如slab和伙伴系统)等,这对于优化内存使用和理解内存泄漏等问题至关重要。 4. **调度器**:调度器负责决定哪个进程应该获得CPU的执行时间。Linux-...

    Android代码-干货集中营

    自定义控件:listview的下拉刷新,上拉加载更多 RecycleView与CardView结合实现瀑布流,下拉刷新,item点击事件 volley异步加载网络,volley加载图片并缓存 glide加载图片并缓存 增加图片放大、缩小手势 支持图片...

    会计干货之让数据说话没错-关键是我们如何理解数据说的话.doc

    会计干货之让数据说话没错-关键是我们如何理解数据说的话.doc

    基于Objective-C与MATLAB/C多语言融合的Gank干货集中营iOS客户端设计源码

    该项目是一款融合Objective-C、MATLAB/C多语言开发的干货集中营iOS客户端设计源码,总计包含137个文件,其中38个PNG图片、30个MATLAB脚本、27个C语言头文件、27个JSON数据文件、3个属性列表文件、2个Xcode工作空间...

    数据治理干货(11份文件)dr.zip

    数据治理干货,11份文件 案例-阿里巴巴数据治理实践 案例-贝壳业务数据治理在中台侧的实践分享 案例-华为数据治理之旅 案例-数据治理流程概述-百度文库 报告-从数据安全法到数据安全治理 报告-中国数据治理调研报告...

    微信小程序源码demo微票源码-demo.zip

    微信小程序是一种轻量级的应用开发平台,由腾讯公司推出,主要应用于移动端,为用户提供便捷的服务和丰富的交互体验。"微信小程序源码demo微票源码-demo.zip" 是一个包含微信小程序开发示例的压缩包,主要用于教学和...

    40款前台页面小程序商城源码,7款前后台小程序商城------学习干货(附预览图)

    在本资源包中,我们拥有40款不同的前台页面小程序商城源码以及7款完整的前后台小程序商城系统,这些都是极具价值的学习材料。这些源码涵盖了微信小程序开发的多个方面,对于想要深入理解和实践小程序商城开发的...

    android 干货源码

    在Android开发中,"干货源码"通常指的是可以复用的、高质量的代码模块或工具类库,它们能够简化开发过程,提高效率。这个特定的项目是一个由个人开发者编写的工具类项目,它包含了多种常见控件的实现,可以直接集成...

    gank微信小程序源码 干货前端源码

    微信小程序源码,前端源码,简单展示源码,原生小程序源码 非uniapp,仅供参考,如有涉及版权问题请联系作者。微信小程序源码,前端源码,简单展示源码,原生小程序源码 非uniapp,仅供参考,如有涉及版权问题请联系...

    微信小程序源码-wechat-weapp-gank-master.zip

    "wechat-weapp-gank-master" 这个文件名可能暗示这是一个关于“干货”的小程序项目,"Gank" 通常指的是技术干货分享平台,因此这个源码可能是用来展示如何获取和展示技术资讯或教程的。通过研究这个项目的源码,...

    微信小程序-gank源码

    Gank(Android开发干货分享)是一款基于微信小程序的实用工具,它汇聚了各种Android开发相关的技术文章、开源项目、工具库等资源,帮助开发者快速获取学习和开发所需的信息。 源码软件是程序员交流学习的重要载体,...

    数据中心干货

    ### 数据中心机房设备标签规范知识点详解 #### 一、前言 随着信息技术的飞速发展,数据中心作为支撑信息化应用的核心物理平台,其建设和维护变得越来越重要。特别是在金融等行业,对于数据中心的投资和维护更是...

    java安卓仿微信聊天软件源码-Resource-collection:GitHub资源整合,干货收集,持续更新

    资源干货合集,持续更新,如果有好的干货可以在Issues上推荐哦(Android resource aggregation, continuous update) 学习项目参考 使用示例-学习资源 :google 开源安卓示例代码 :安卓转换动画学习库,非常全面 :...

    干货保险理赔数据分析PPT课件.pptx

    干货保险理赔数据分析PPT课件.pptx

    【精品干货】数据治理精华资料合集-共7份.zip

    精品干货,数据治理精华资料合集,共7份。 2021数据治理工具图谱研究报告.pdf 华为数据之道-学习资料.pdf 华为数据治理:怎样才能管好企业数据.pdf 华为数据治理之旅.pdf 数据治理总体解决方案.docx DCMM评估检查表...

    干货分享基于SSM的体育场管理系统-源码

    然而,传统的体育场管理方式存在诸多问题,如资源分配不均、预约流程繁琐、数据统计不准确等,严重影响了体育场的使用效率和用户体验。因此,设计和实现一套基于SSM(Spring、Spring MVC、MyBatis)框架的体育场管理...

Global site tag (gtag.js) - Google Analytics