[原创]WinForm分页控件制作
先简单说一下思路:
1、做一个分页控件的导航类,即记录总页数、当前页、每页记录数,下一页、上一页、跳转等操作的页数变更。
class PageNavigation
{
/// <summary>
/// display item count for per page
/// default value is 20
/// </summary>
private int _iPerItemCount = 20;
public int PerItemCount
{
get { return _iPerItemCount; }
set { _iPerItemCount = value; }
}
/// <summary>
/// total item count
/// </summary>
private int _iTotalItemCount;
public int TotalItemCount
{
get { return _iTotalItemCount; }
set { _iTotalItemCount = value; }
}
/// <summary>
/// current page index
/// </summary>
private int _iCurrentPageIndex = 1;
public int CurrentPageIndex
{
get { return _iCurrentPageIndex; }
set
{
if (value > PageCount)
{
_iCurrentPageIndex = PageCount;
return;
}
if (value < 1)
{
_iCurrentPageIndex = 1;
return;
}
_iCurrentPageIndex = value;
}
}
/// <summary>
/// total page count
/// </summary>
public int PageCount
{
get
{
if (_iTotalItemCount != 0 && _iPerItemCount != 0)
return (int)Math.Ceiling(((decimal)_iTotalItemCount) / ((decimal)_iPerItemCount));
else return 1;
}
}
/// <summary>
/// current start item index for current page index
/// </summary>
public int CurrentStartItemIndex
{
get { return (CurrentPageIndex - 1) * _iPerItemCount + 1; }
}
/// <summary>
/// current end item index for current page index
/// </summary>
public int CurrentEndItemIndex
{
get
{
return CurrentPageIndex * _iPerItemCount > _iTotalItemCount ? _iTotalItemCount :
CurrentPageIndex * _iPerItemCount;
}
}
public int CurrentItemCount
{
get { return CurrentEndItemIndex - CurrentStartItemIndex <= 0 ? 0 : CurrentEndItemIndex - CurrentStartItemIndex + 1; }
}
/// <summary>
/// jump to next page
/// </summary>
public void JumpToNextPage()
{
CurrentPageIndex += 1;
}
/// <summary>
/// jump to pre page
/// </summary>
public void JumpToPrePage()
{
CurrentPageIndex = _iCurrentPageIndex == 1 ? _iCurrentPageIndex : _iCurrentPageIndex - 1;
}
/// <summary>
/// jump to first page
/// </summary>
public void JumpToFirstPage()
{
CurrentPageIndex = 1;
}
/// <summary>
/// jump to last page
/// </summary>
public void JumpToLastPage()
{
CurrentPageIndex = PageCount;
}
/// <summary>
/// jump to user page
/// </summary>
/// <param name="iCurPageIndex"></param>
public void Jump(int iCurPageIndex)
{
CurrentPageIndex = iCurPageIndex;
}
}
2、导航控件(UserControl)制作,即将导航类与导航页联系到一起
注:此控件与传统的控件不同之处:将宿主通过属性传递给了导航控件。这样做的好处:宿主不用直接处理数据源的绑定工作,外部调用的时候直接将宿主传进导航控件即可,绑定数据源直接操作导航控件数据源。这样做的缺点:违背了面向对象单一原则。(但是控件都是为了业务服务的嘛,这样用起来比较方便,只要给导航个宿主和数据源,它就可以自己自动实现分页操作了)。
public partial class CtrlPageNavigation : UserControl
{
private PageNavigation _pageNavigation;
public int PerItemCount
{
get { return _pageNavigation.PerItemCount; }
set { _pageNavigation.PerItemCount = value; }
}
public int TotalItemCount
{
get { return _pageNavigation.TotalItemCount; }
set { _pageNavigation.TotalItemCount = value; }
}
private GridControl _hostGridControl;
public GridControl HostGridControl // 宿主,宿主的类型可以根据需要变更哦,当然也可以用泛型
{
get { return _hostGridControl; }
set
{
_hostGridControl = value;
if (_hostGridControl != null)
{
GridView view = _hostGridControl.DefaultView as GridView;
view.CustomDrawRowIndicator +=new RowIndicatorCustomDrawEventHandler(view_CustomDrawRowIndicator); // 用于显示行号
}
}
}
private IList _dataSource;
public IList DataSource
{
get { return _dataSource; }
set
{
_dataSource = value;
_pageNavigation.CurrentPageIndex = 1;
RefreshHostGridControl();
}
}
public CtrlPageNavigation()
{
InitializeComponent();
_pageNavigation = new PageNavigation();
_pageNavigation.PerItemCount = 20; // 设置默认值
this.ParentChanged += new EventHandler(OnParentChanged); // 找到父类,设置窗体快捷键
}
public void RefreshData()
{
RefreshHostGridControl();
RefreshCurrentPage();
}
private void RefreshHostGridControl()
{
if (this._hostGridControl == null) return;
List<object> currentDataSource = new List<object>();
if (_dataSource != null && _dataSource.Count != 0)
{
for (int i = _pageNavigation.CurrentStartItemIndex - 1; i < _pageNavigation.CurrentEndItemIndex; i++)
{
currentDataSource.Add(_dataSource[i]);
}
}
this._hostGridControl.DataSource = currentDataSource;
this._hostGridControl.RefreshDataSource();
}
private void RefreshCurrentPage()
{
this.txtPageIndex.Value = _pageNavigation.CurrentPageIndex;
this.lblTotal.Text =
string.Format(
"总计{0}条,当前{1}/{2}页",
this._pageNavigation.TotalItemCount,
this._pageNavigation.CurrentPageIndex,
this._pageNavigation.PageCount
);
}
private void OnFirstPageClick(object sender, EventArgs e)
{
_pageNavigation.JumpToFirstPage();
RefreshData();
if (FirstPageClick != null)
FirstPageClick(sender, e);
}
private void OnPrePageClick(object sender, EventArgs e)
{
_pageNavigation.JumpToPrePage();
RefreshData();
if (PrePageClick != null)
PrePageClick(sender, e);
}
private void OnNextPageClick(object sender, EventArgs e)
{
_pageNavigation.JumpToNextPage();
RefreshData();
if (NextPageClick != null)
NextPageClick(sender, e);
}
private void OnLastPageClick(object sender, EventArgs e)
{
_pageNavigation.JumpToLastPage();
RefreshData();
if (LastPageClick != null)
LastPageClick(sender, e);
}
private void OnJumpClick(object sender, EventArgs e)
{
_pageNavigation.Jump((int)this.txtPageIndex.Value);
RefreshData();
if (JumpClick != null)
JumpClick(sender, e);
}
// 显示行号,不需要的朋友可以不用的哦
void view_CustomDrawRowIndicator(object sender, RowIndicatorCustomDrawEventArgs e)
{
if (e.Info.IsRowIndicator && e.RowHandle >= 0)
{
e.Info.DisplayText = (e.RowHandle + this._pageNavigation.CurrentStartItemIndex).ToString().Trim();
}
}
// 这里主要是注册快捷键操作,不需要的朋友可以不用的哦
void OnParentChanged(object sender, EventArgs e)
{
if (this.ParentForm != null)
{
// 注册快捷键
this.ParentForm.KeyPreview = true;
this.ParentForm.KeyUp += new KeyEventHandler(OnParentFormKeyUp);
}
}
void OnParentFormKeyUp(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.PageUp:
this.btnPrePage.PerformClick();
break;
case Keys.PageDown:
this.btnNextPage.PerformClick();
break;
}
}
public event EventHandler FirstPageClick; // 对外提供的事件,可以用可以不用
public event EventHandler NextPageClick;
public event EventHandler PrePageClick;
public event EventHandler LastPageClick;
public event EventHandler JumpClick;
}
3、应用
public Form1()
{
InitializeComponent();
this.ctrlPageNavigation1.HostGridControl = this.gridControl1;
this.ctrlPageNavigation1.DataSource = _dataSource;
}
[原创]WinForm分页控件制作的更多相关文章
- 在DevExpress程序中使用Winform分页控件直接录入数据并保存
一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数 ...
- winform 分页控件
http://www.cnblogs.com/liuyunsheng/p/4853387.html http://www.cnblogs.com/wuhuacong/archive/2011/07/0 ...
- 开发框架模块视频系列(2)-Winform分页控件介绍
在软件开发过程中,为了节省开发时间,提高开发效率,统一用户处理界面,尽可能使用成熟.功能强大的分页控件,这款Winform环境下的分页控件,集成了数据分页.内容提示.数据打印.数据导出.表头中文转义等 ...
- 类似web风格的 Winform 分页控件
背景 最近做一个Winform的小程序,需要用到分页,由于之前一直在用 TonyPagerForWinForm.dll ,但该库没有源代码,网上找的也不全面,索性就准备自己改造一个.在园子里翻了一下, ...
- 【NET】Winform分页控件初探
public partial class WinFormPager : UserControl { ; /// <summary> /// 当前页 /// </summary> ...
- C# devexpress gridcontrol 分页 控件制作
这个小小的功能实现起来还是有一点点复杂, 分页单独一个usercontrol 出来,导致查询换页 与gridcontrol页面分离, 一般通过换页事件通知girdcontrol 做出查询 查询来说有 ...
- Winform分页控件
设计界面: 控件代码: using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...
- 使用WinForm Chart控件 制作饼装,柱状,折线图
http://blog.csdn.net/dream2050csdn/article/details/53510340 chart控件的属性很多,主要用到Chart控件图表区域的属性有五个属性 1.A ...
- 如何Windows分页控件中增加统计功能
在我的博客里面,很多Winform程序里面都用到了分页处理,这样可以不管是在直接访问数据库的场景还是使用网络方式访问WCF服务获取数据,都能获得较好的效率,因此WInform程序里面的分页控件的使用是 ...
随机推荐
- 关于打印机能PING通但是无法打开\\地址的问题
首先PING地址,看是否能否PING通,如果不通,代表网络不通不能共享, 如果能PING通,但是无法打开\\地址,那么就就检查这几个地方: 1 防火墙是否关闭 2 print splooer 打印 ...
- HTML5 canvas绘图
HTML5 canvas画图 示例 ------- <!DOCTYPE html> <head> <meta charset="UTF-8"> ...
- 移动端js写法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- _beginthreadex注意事项
_beginthreadex 当失败时返回0 而不是 -1L _beginthreadex调用之后返回的HANDLE,必须手动CloseHandle,才能正确释放句柄.
- 求空间内两条直线的最近距离以及最近点的坐标(C++)
关键词:空间几何 用途:总有地方会用到吧 文章类型:C++函数展示 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-19 @Lab: CvLab20 ...
- 用FileInputStream读取数据,计算机如何实现将两个字节拼接成中文的?
package itcast_02; import java.util.Arrays; /* * 在计算机中如何识别将连个字节转换为中文的呢? * 在计算机中中文的存储为两个字节 : * 第一个字节 ...
- 利用scrapy-splash爬取JS生成的动态页面
目前,为了加速页面的加载速度,页面的很多部分都是用JS生成的,而对于用scrapy爬虫来说就是一个很大的问题,因为scrapy没有JS engine,所以爬取的都是静态页面,对于JS生成的动态页面都无 ...
- Node聊天程序实例02:chat_server.js
作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. chat_s ...
- HTML转义字符大全
ISO Latin-1字符集: — 制表符Horizontal tab — 换行Line feed — 回车Carriage Return — Space ! ! — 惊叹号Exclamati ...
- HTML中使背景图片自适应浏览器大小
由于<body>标签的图片不能够拉伸, 解决办法: 1.图片不够大,又background属性不能拉伸图片: 2.只能用个div,把其z-index值设为负,并使这个div大小为整个bod ...