[原创]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;
}

时间: 2024-10-22 13:15:08

[原创]WinForm分页控件制作的相关文章

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

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

winform分页控件

五一过的一多半已经过去了,感觉过的真快. 言归正传说说最近一直在用的winform分页控件. 一. 添加新项-用户控件 二.拖控件,这个很简单 三.写代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Win

类似web风格的 Winform 分页控件

背景 最近做一个Winform的小程序,需要用到分页,由于之前一直在用 TonyPagerForWinForm.dll ,但该库没有源代码,网上找的也不全面,索性就准备自己改造一个.在园子里翻了一下,发现路过秋天在多年前写了个分页控件,Winform 通用分页控件实战篇(提供源码下载).站在大神的肩膀上就是快,一会就改好了. 效果图 功能比较齐全,不过样式上,楼主十分喜欢easyUI或ext的列表分页风格.于是换了几个按钮,添加了图标,看看现在的效果. 控件源码在正文最下方. 使用简介 就那么一

C# winform 分页控件 datagridview列宽度自适应

版权归原作者(伍华聪)所有. VS2019 .Net FrameWork 4.7.2 1.修改按钮上文字,调整按钮大小.修改按钮和文本框字体为Microsoft Sans Serif, 9pt”,字体电脑中都有,可以尽量水平和垂直居中. 2.因为没有文档,导出excel总不成功,取消掉了导出按钮. 3.修改分页控件水平居中. 下载 视频 4.datagridview列宽度自适应 using System; using System.Collections.Generic; using Syste

WinForm下编写分页控件,实现DataGridView的分页效果

 前几天做C/S项目的时候用到了分页查询,所以就想去网上找一些封装好的分页控件,类似BS项目中的那种.但是找了好几个都不是特别的好,没有自己想要的.而且WinForm 里面的DataGridView也不像WebForm里面的GridView那样有自带的分页功能.没办法还是自己动手封装一个吧,以后复用也方便. 从网上找了几个demo做了一下,实现挺简单的. 用到的方法就是编写一个用户控件,下面说明如何实现: 一,先画界面 新建一个用户控件,然后拖拽几个标签,文本框和按钮,排列好.如下图所示:

如何Windows分页控件中增加统计功能

在我的博客里面,很多Winform程序里面都用到了分页处理,这样可以不管是在直接访问数据库的场景还是使用网络方式访问WCF服务获取数据,都能获得较好的效率,因此WInform程序里面的分页控件的使用是很好的一个解决方式,它能够快速获取数据,并将可能减少我们增加太多的代码逻辑,实现简单.高效.统一的理念.本篇主要介绍如何在分页的GridControl里面如何实现数据的统计功能. 一般情况下,分页控件呈现分为两种方式,一种需要有分页码的真正分页处理,一种是不需要分页处理,但是列表和功能基本保持一致的

winform快速开发平台 -&gt; 基础组件之分页控件

一个项目控件主要由及部分的常用组件,当然本次介绍的是通用分页控件. 处理思想:我们在处理分页过程中主要是针对数据库操作. 一般情况主要是传递一些开始位置,当前页数,和数据总页数以及相关关联的业务逻辑. 当然我们不可能将控件的所有事件都发布出来. 我们返现所有的按钮操作都是围绕着我们的的查询记录来进行操作. 至此我们只需要提供出一个事件方法. 对外开放进行数据绑定即可. 完成对数据的分页参数处理. 分页控件如下图所示: 相关业务代码:主要代码由事件委托来处理 有了通用的分页控件,我们发现并没有绑定

winform 自定义分页控件 及DataGridview数据绑定

分页效果如上图所示,用到的控件均为基本控件 ,其方法如下 右击项目-添加-新建项 选择用户控件 然后在用户控件中拖入所需要的Label,Button,Text 用户控件全部代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; usin

Winform自定义分页控件的实现

实现效果 有点丑陋 但是功能是没问题的 测试过 实现思路 先创建一个用户控件 代码实现 public partial class PagerControl : UserControl { private int record = 0; /// <summary> /// 总记录数 /// </summary> public int Record { get { return record; } set { record = value; InitPageInfo(); } } pr