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

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

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

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

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

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

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

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

  1 using System;
  2 using System.ComponentModel;
  3 using System.Windows.Forms;
  4 namespace RDIFramework.Controls
  5 {
  6     public delegate void PageChangedEventHandler(object sender, EventArgs e);
  7     /// <summary>
  8     /// 分页用户控件,仅提供分页信息显示及改变页码操作
  9     /// </summary>
 10 public partial class UcPagerEx : UserControl
 11 {
 12         public event PageChangedEventHandler PageChanged;
 13         private int _pageSize;
 14         private int m_PageCount;
 15         private int _recordCount;
 16         private int _pageIndex;
 17
 18
 19         public UcPagerEx()
 20         {
 21             InitializeComponent();
 22             this._pageSize = 10;
 23             this._recordCount = 0;
 24             this._pageIndex = 1; //默认为第一页
 25         }
 26         /// <summary>
 27         /// 带参数的构造函数
 28         /// <param name="pageSize">每页记录数</param>
 29         /// <param name="recordCount">总记录数</param>
 30         /// </summary>
 31         public UcPagerEx(int recordCount, int pageSize)
 32         {
 33             InitializeComponent();
 34
 35             this._pageSize = pageSize;
 36             this._recordCount = recordCount;
 37             this._pageIndex = 1; //默认为第一页
 38             this.InitPageInfo();
 39         }
 40         protected virtual void OnPageChanged(EventArgs e)
 41         {
 42             if (PageChanged != null)
 43             {
 44                 InitPageInfo();
 45                 PageChanged(this, e);
 46             }
 47         }
 48         [Description("设置或获取一页中显示的记录数目"), DefaultValue(20), Category("分页")]
 49         public int PageSize
 50         {
 51             set
 52             {
 53                 this._pageSize = value;
 54             }
 55             get
 56             {
 57                 return this._pageSize;
 58             }
 59         }
 60
 61         [Description("获取记录总页数"), DefaultValue(0), Category("分页")]
 62         public int PageCount
 63         {
 64             get
 65             {
 66                 return this.m_PageCount;
 67             }
 68         }
 69
 70         [Description("设置或获取记录总数"), Category("分页")]
 71         public int RecordCount
 72         {
 73             set
 74             {
 75                 this._recordCount = value;
 76             }
 77             get
 78             {
 79                 return this._recordCount;
 80             }
 81         }
 82
 83         [Description("当前的页面索引, 开始为1"), DefaultValue(0), Category("分页")]
 84         [Browsable(false)]
 85         public int PageIndex
 86         {
 87             set
 88             {
 89                 this._pageIndex = value;
 90             }
 91             get
 92             {
 93                 return this._pageIndex;
 94             }
 95         }
 96
 97         /// <summary>
 98         /// 初始化分页信息
 99         /// <param name="pageSize">每页记录数</param>
100         /// <param name="recordCount">总记录数</param>
101         /// </summary>
102         public void InitPageInfo(int recordCount, int pageSize)
103         {
104             this._recordCount = recordCount;
105             this._pageSize = pageSize;
106             this.InitPageInfo();
107         }
108
109         /// <summary>
110         /// 初始化分页信息
111         /// <param name="recordCount">总记录数</param>
112         /// </summary>
113         public void InitPageInfo(int recordCount)
114         {
115             this._recordCount = recordCount;
116             this.InitPageInfo();
117         }
118         /// <summary>
119         /// 初始化分页信息
120         /// </summary>
121         public void InitPageInfo()
122         {
123             if (this._pageSize < 1)
124                 this._pageSize = 10; //如果每页记录数不正确,即更改为10
125             if (this._recordCount < 0)
126                 this._recordCount = 0; //如果记录总数不正确,即更改为0
127
128             //取得总页数
129             if (this._recordCount % this._pageSize == 0)
130             {
131                 this.m_PageCount = this._recordCount / this._pageSize;
132             }
133             else
134             {
135                 this.m_PageCount = this._recordCount / this._pageSize + 1;
136             }
137
138             //设置当前页
139             if (this._pageIndex > this.m_PageCount)
140             {
141                 this._pageIndex = this.m_PageCount;
142             }
143             if (this._pageIndex < 1)
144             {
145                 this._pageIndex = 1;
146             }
147
148             //设置上一页按钮的可用性
149             bool enable = (this.PageIndex > 1);
150             this.btnPrevious.Enabled = enable;
151
152             //设置首页按钮的可用性
153             enable = (this.PageIndex > 1);
154             this.btnFirst.Enabled = enable;
155
156             //设置下一页按钮的可用性
157             enable = (this.PageIndex < this.PageCount);
158             this.btnNext.Enabled = enable;
159
160             //设置末页按钮的可用性
161             enable = (this.PageIndex < this.PageCount);
162             this.btnLast.Enabled = enable;
163             this.txtPageIndex.Text = this._pageIndex.ToString();
164             this.lblPageInfo.Text = string.Format("共 {0} 条记录,每页 {1} 条,共 {2} 页", this._recordCount, this._pageSize, this.m_PageCount);
165         }
166
167         public void RefreshData(int page)
168         {
169             this._pageIndex = page;
170             EventArgs e = new EventArgs();
171             OnPageChanged(e);
172         }
173
174         private void btnFirst_Click(object sender, System.EventArgs e)
175         {
176             this.RefreshData(1);
177         }
178
179         private void btnPrevious_Click(object sender, System.EventArgs e)
180         {
181             if (this._pageIndex > 1)
182             {
183                 this.RefreshData(this._pageIndex - 1);
184             }
185             else
186             {
187                 this.RefreshData(1);
188             }
189         }
190         private void btnNext_Click(object sender, System.EventArgs e)
191         {
192             if (this._pageIndex < this.m_PageCount)
193             {
194                 this.RefreshData(this._pageIndex + 1);
195             }
196             else if (this.m_PageCount < 1)
197             {
198                 this.RefreshData(1);
199             }
200             else
201             {
202                 this.RefreshData(this.m_PageCount);
203             }
204         }
205
206         private void btnLast_Click(object sender, System.EventArgs e)
207         {
208             this.RefreshData(this.m_PageCount > 0 ? this.m_PageCount : 1);
209         }
210
211         private void txtPageIndex_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
212         {
213             if (e.KeyCode == Keys.Enter)
214             {
215                 int num;
216                 try
217                 {
218                     num = Convert.ToInt16(this.txtPageIndex.Text);
219                 }
220                 catch
221                 {
222                     num = 1;
223                 }
224
225                 if (num > this.m_PageCount)
226                     num = this.m_PageCount;
227                 if (num < 1)
228                     num = 1;
229
230                 this.RefreshData(num);
231             }
232         }
233     }
234 }

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

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

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

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

 1 private void Search()
 2 {
 3     var recordCount = 0;
 4     this.DTProductInfo = GetData(out recordCount, ucPager.PageIndex, ucPager.PageSize, this.searchValue);
 5     ucPager.RecordCount = recordCount;
 6     ucPager.InitPageInfo();
 7     // 加载绑定数据
 8     this.GetList();
 9 }
10
11 private DataTable GetData(out int recordCount, int pageIndex, int pageSize,string search)
12 {
13     return new ProductInfoManager(dbProvider).GetDTByPage(out recordCount, pageIndex, pageSize, search,ProductInfoTable.FieldCreateOn + " DESC ");
14 }
15
16 public override void GetList()
17 {
18     this.dgvProductInfo.AutoGenerateColumns = false;
19     if (this.DTProductInfo.Columns.Count > 0)
20     {
21         this.DTProductInfo.DefaultView.Sort = ProductInfoTable.FieldCreateOn;
22     }
23
24     this.dgvProductInfo.DataSource = this.DTProductInfo.DefaultView;
25     this.SetControlState();
26 }

  同时需要对UcPagerEx的PageChanged事件做处理,以启用用户分页的需求,代码如下:

1 private void ucPager_PageChanged(object sender, EventArgs e)
2 {
3     var holdCursor = this.Cursor;
4     this.Cursor = Cursors.WaitCursor;
5     Search();
6     this.Cursor = holdCursor;
7 }

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

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

作者: EricHu
出处: http://www.cnblogs.com/huyong
Email: [email protected]
QQ 交流:406590790 QQ群: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 联系我,非常感谢。

时间: 2024-08-06 16:04:40

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

Qt qml listview 下拉刷新上拉分页控件

Qt qml listview下拉刷新和上拉分页主要根据contentY来判断.但要加上顶部下拉指示器.滚动条,并封装成可简单调用的组件,着实花了我不少精力:) [先看效果]    [功能] 1 下拉刷新和上拉分页逻辑 2 /下拉刷新 3 /上拉更多 4 /滚动栏 5 /工具栏半拉显隐 6 Author: surfsky.cnblogs.com 7 Lisence: MIT 请保留此文档声明 8 History: 9 init. surfsky.cnblogs.com, 2015-01 10 a

分页控件之jPaginate

1.网上搜索相关的分页控件,下载它的demo文件 2.打开demo文件,里面会有一个html静态页,打开研究 3.查看源代码,找出控件所依赖的js和css 开始实操: 1.新建一个html或者aspx页面,把控件依赖的js和css拉入项目并在页面中引用 2.创建一个div,对其进行控件的初始化,直接复制demo下的源代码即可 3.现在浏览就应该会出现效果了. ---经过以上,仅仅是把控件展示在项目中,但是还没有和我们的业务进行相关的绑定!!! ----重点来了. 当浏览器/Ajax发出请求分页数

c# winform 循环遍历界面上的所有控件,foreach,Controls,AllowDrop

foreach (System.Windows.Forms.Control control in this.groupBox2.Controls)//遍历groupBox2上的所有控件 { if (control is System.Windows.Forms.PictureBox) { System.Windows.Forms.PictureBox pb = (System.Windows.Forms.PictureBox)control; pb.AllowDrop = true; } if

在DevExpress程序中使用Winform分页控件直接录入数据并保存

一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数据,这种对于字段比较少,而且内容相对比较简单的情况下,效率是比较高的一种输入方式.本篇随笔主要介绍在DevExpress程序中使用GridView直接录入数据并保存的实现,以及使用Winform分页控件来进行数据直接录入的实现操作. 1.在GridView上展示数据 在GridView上展示数据,只

【asp.net爬虫】asp.NET分页控件抓取第n页数据 javascript:__doPostBack

最近在模拟HTTP请求抓取数据,但是服务器是asp.net开发的 分页控件代码 <tr> <td align="left">共&nbsp210&nbsp条记录&nbsp--&nbsp第&nbsp2&nbsp页&nbsp--&nbsp共&nbsp3&nbsp页</td><td align="right"><a id="Orac

【干货分享】JPager.Net MVC超好用轻量级分页控件

JPager.Net  MVC好用的轻量级分页控件,好用到你无法想象,轻量到你无法想象. JPager.Net  MVC好用的轻量级分页控件,实现非常简单,使用也非常简单. JPager.Net  MVC好用的轻量级分页控件,代码精心推敲,经多人反复建议修改,最终成型使用中.非常好用分享给大家.源代码一共放出来.先上个效果图: JPager.Net  MVC好用的轻量级分页控件JPager.Net .dll核心代码 PagerInBase.cs namespace JPager.Net { //

企业级控件库之大数据量分页控件(转)

在上篇:我介绍了原创企业级控件库之组合查询控件,这篇我将给大家介绍:企业级控件库之大数据量分页控件.  摘要  说到分页,大家采用的方法各有千秋,分页在一个中大型软件项目中对数据的快速呈现起到很关键的作用,试想一个数据量上几十万或者几百万的数据表,要是没有分页功能会是一个什么样的效果.总的说来,大家采用的分页方法大同小异,但到底那种方法才是最佳的呢,各有各的看法,让数据说话最有效.今天我给大家分享一个WinForm下大数据量分页控件(当然分页思想也可用于WebForm).虽然不能说是最佳的,但在

分页控件AspNetPager学习笔记

1.AspNetPager简介 AspNetPager是一款开源.简单易用.可定制化等等各种优点的Web分页控件. 2.使用方法 1)下载AspNetPager.dll文件(http://www.webdiyer.com/aspnetpager/downloads/) 2)添加对该文件的引用 3)工具栏右键-选择项,把该dll控件添加进工具栏 4)把该控件拖进设计界面,设置控件的各种属性如下: <webdiyer:AspNetPager ID="AspNetPager1" run

asp.net 分页-自己写分页控件

去年就发表过asp.net 分页-利用后台直接生成html分页 ,那种方法只是单纯的实现了分页,基本不能使用,那时就想写个自己的分页控件,无奈能力有限.最近有点时间了,就自己做出了这个分页控件.我承认,这个控件参考了别人的,但是其实里面的原理都相同,差异只是展现方式而已. 去年就在做一个自己的后台系统,刚开始用的asp.net,做了一部分就没有做了,因为缺少权限控制类别.后面转为用asp.net mvc4做,也只是做了一部分,觉得不太方便,也许是我不太会用.再用ajax+ashx做了一部分,虽然