1、需求

在开发桌面系统时难免会碰到一些很大的表格,上千行甚至上万行,如果把这些表格全部用GridControl展示出来难免会觉得系统很臃肿,而且会影响系统的效率,所以对表格进行分页就比较重要了。其实在Dev中有自带的所谓“分页控件DataNavigation”,但是那个和我们一般使用的还是有很大区别,dev自带的分页控件准确来说是一个导航控件,显示的还是一张大表。

2、分页控件UI设计


左边是上下页和首末页的label,点击控件触发响应事件,还可以在文本框中输入页码来指定页跳转,还可以设置每页显示的条数。

3、代码实现

3.1属性和私有变量的定义

我定义了绑定的GridControl控件(BindingGrid)、原始表(BindingDataTable)、显示表(ShowingDataTable)和其他用于显示表格信息的属性。这样做有一个问题,如果绑定的表格控件绑定的数据是列表那么就比较麻烦,优化的时候可以在这个点进行优化。

     #region 定义变量private int dataSourceRowsCount;#endregion#region 定义属性/// <summary>/// 绑定的表格控件/// </summary>public GridControl BindingGrid{get; set;}/// <summary>/// 和控件关联的表格/// </summary>public DataTable BindingDataTable{get; set;}/// <summary>/// 显示的表格/// </summary>public DataTable ShowingDataTable{get; set;}/// <summary>/// 总页数/// </summary>public int TotalPages{get; set;}/// <summary>/// 当前页/// </summary>public int CurrentPage{get; set;}/// <summary>/// 每页条数/// </summary>public int RowsCount{get; set;}#endregion

3.2控件初始化

我这里最开始没设计好,需要提供两个参数进行控件初始化,后期可以优化成只提供GridControl参数进行初始化。

     /// <summary>/// 初始化控件显示/// </summary>/// <param name="dataTable"></param>public void InitCtrl(DataTable dataTable, GridControl gridControl){try{#region 初始化属性BindingGrid = gridControl;BindingDataTable = dataTable;RowsCount = Convert.ToInt32(cbxRowCount.Text);dataSourceRowsCount = BindingDataTable.Rows.Count;TotalPages = (int)Math.Ceiling((double)dataSourceRowsCount / RowsCount);CurrentPage = dataSourceRowsCount == 0 ? 0 : 1;ShowingDataTable = new DataTable();if (BindingDataTable.Rows.Count == 0){#region 初始化控件显示tbxCurrentPage.Text = CurrentPage.ToString();lbTotalPages.Text = TotalPages.ToString();lbTotalRows.Text = "共 " + dataSourceRowsCount.ToString() + " 条记录";#endregionreturn;}if (BindingDataTable.Rows.Count > 0 && BindingDataTable.Rows.Count <= RowsCount){ShowingDataTable = BindingDataTable.Copy();}else{DataColumnCollection dataColumns = BindingDataTable.Columns;foreach (DataColumn dataColumn in dataColumns){ShowingDataTable.Columns.Add(dataColumn.ColumnName, dataColumn.DataType);}DataRow dataRow = null;for (int i = 0; i < 20; i++){dataRow = ShowingDataTable.NewRow();int s = ShowingDataTable.Rows.Count;dataRow = BindingDataTable.Rows[i];ShowingDataTable.ImportRow(dataRow);}}#endregion#region 初始化控件显示tbxCurrentPage.Text = CurrentPage.ToString();lbTotalPages.Text = "共 " + TotalPages.ToString() + " 页";lbTotalRows.Text = "共 " + dataSourceRowsCount.ToString() + " 条记录";#endregion}catch (Exception ex){XtraMessageBox.Show("初始化列表失败");//添加日志记录相关方法}finally{BindingGrid.DataSource = ShowingDataTable;BindingGrid.Refresh();}}

3.3 上下页和首末页点击事件

        //点击首页按钮private void lbFirstPage_Click(object sender, EventArgs e){if (CurrentPage == 1)return;CurrentPage = 1;tbxCurrentPage.Text = CurrentPage.ToString();SetShowingDataTable();}//点击上一页按钮private void lbPrePage_Click(object sender, EventArgs e){if (CurrentPage == 1)return;CurrentPage--;tbxCurrentPage.Text = CurrentPage.ToString();SetShowingDataTable();}//点击下一页按钮private void lbNextPage_Click(object sender, EventArgs e){if (CurrentPage == TotalPages)return;CurrentPage++;tbxCurrentPage.Text = CurrentPage.ToString();SetShowingDataTable();}//末页按钮private void lbEnd_Click(object sender, EventArgs e){if (CurrentPage == TotalPages)return;CurrentPage = TotalPages;tbxCurrentPage.Text = CurrentPage.ToString();SetShowingDataTable();}

上面的代码中,SetShowingDataTable()方法用来生成显示的表格:

        /// <summary>/// 根据当前页、显示行数确定显示的表格/// </summary>private void SetShowingDataTable(){try{if (BindingDataTable.Rows.Count <= RowsCount){ShowingDataTable = BindingDataTable.Copy();return;}else{int startRowIndex = (CurrentPage - 1) * RowsCount;int endRoeIndex = startRowIndex + RowsCount;if (endRoeIndex > BindingDataTable.Rows.Count){endRoeIndex = BindingDataTable.Rows.Count;}ShowingDataTable.Rows.Clear();DataRow dataRow = null;for (int i = startRowIndex; i < endRoeIndex; i++){dataRow = ShowingDataTable.NewRow();dataRow = BindingDataTable.Rows[i];ShowingDataTable.ImportRow(dataRow);}}}catch (Exception ex){XtraMessageBox.Show("列表显示失败");//添加日志记录相关方法}finally{BindingGrid.DataSource = ShowingDataTable;BindingGrid.Refresh();}}#endregion

3.4 更改条数和跳转指定页

        //选择每页显示条数private void cbxRowCount_SelectedIndexChanged(object sender, EventArgs e){RowsCount = Convert.ToInt32(cbxRowCount.Text);CurrentPage = 1;TotalPages = (int)Math.Ceiling((double)BindingDataTable.Rows.Count / RowsCount);ShowingDataTable.Rows.Clear();SetShowingDataTable();tbxCurrentPage.Text = CurrentPage.ToString();lbTotalPages.Text = TotalPages.ToString();}//手动输入显示页面编号private void tbxCurrentPage_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode == Keys.Enter){int page = Convert.ToInt32(tbxCurrentPage.Text);if (page < 1){CurrentPage = 1;tbxCurrentPage.Text = "1";}else if (page > TotalPages){CurrentPage = TotalPages;tbxCurrentPage.Text = CurrentPage.ToString();}else{CurrentPage = page;tbxCurrentPage.Text = CurrentPage.ToString();}SetShowingDataTable();}}

3.5 调用自定义分页控件

在控件初始化之后,直接调用InitCtrl()方法进行初始化:

//vs自动生成的代码
private UserControls.Data.CtrlGridNavigation ctrlGridNavigation1;
this.ctrlGridNavigation1 = new UserControls.Data.CtrlGridNavigation();
//ctrlGridNavigation1.InitCtrl(bindingDataTable, bindingGridControl);

4、代码下载

github:github下载
CSDN:CSDN下载

C# .net+DevExpress自定义控件(UserControl)之分页控件相关推荐

  1. C# devexpress gridcontrol 分页 控件制作

    这个小小的功能实现起来还是有一点点复杂, 分页单独一个usercontrol 出来,导致查询换页 与gridcontrol页面分离,  一般通过换页事件通知girdcontrol 做出查询 查询来说有 ...

  2. QuickPager asp.net 分页控件 转

    QuickPager asp.net 分页控件.表单控件等自定义控件下载 和介绍 最新下载地址: 自然框架的源代码.Demo.数据库.配置信息管理程序下载(2010.01.25更新) QuickCon ...

  3. 【开源】我的分页控件正式命名为QuickPager ASP.NET2.0分页控件

    分页控件正式命名为 QuickPager ASP.NET2.0分页控件 . 版本号:2.0.0.1 Framework:.net2.0 分页方式:PostBack .URL (暂时没有实现URL的分页 ...

  4. dev treeview控件_在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件

    DevExpress提供的树形列表控件TreeList和树形下拉列表控件TreeListLookupEdit都是非常强大的一个控件,它和我们传统Winform的TreeView控件使用上有所不同,我一 ...

  5. Winform分页控件之纯分页显示处理

    在之前介绍的Winform分页控件中,都以分页控件+显示表格控件作为一个整体性的控件,不可分开,这样做的目的是可以实现更多的操作,集成更多丰富的特性,减少我们开发的工作量,这种情况虽然适用于大多数的情 ...

  6. WPF 分页控件应用

    效果图:    前台代码: <UserControl x:Class="Layout.UI.Comm.Pager"xmlns="http://schemas.mic ...

  7. WPF 实现 DataGrid/ListView 分页控件

    原文:WPF 实现 DataGrid/ListView 分页控件 在WPF中,通常会选用DataGrid/ListView进行数据展示,如果数据量不多,可以直接一个页面显示出来.如果数据量很大,200 ...

  8. WPF学习:分页控件

      好多年没有发博了,今天闲暇,把给公司做的ERP分页控件拿出来,有很多都用到分页的,所以就封装了一个UserControl分页控件,效果还不错,可以看看,先! 注意:有用到存储过程. 如果还不明白, ...

  9. winform自定义分页控件

    1.控件代码: public partial class PagerControl : UserControl {#region 构造函数public PagerControl() {Initiali ...

  10. VB.NET学习笔记:自定义控件之扩展TEXTBOX控件——水印文字提示效果

    测试环境:windows 7和Microsoft Visual Studio 2017 看到一些优秀软件里的TEXTBOX文本框都有水印文字提示应该输入什么样的信息,获取光标后提示文字消失,光标离开后 ...

最新文章

  1. java socket安全策略文件
  2. CI 在nginx中出现404错误的解决方式
  3. ARM学习方法大杂烩,高手经验之谈,内容完全来自互联网
  4. 元计算:《元计算破解生命密码》听课笔记
  5. (12) Hibernate+EhCache配置二级缓存
  6. python分析政策实施前后_用Python分析春节前后的中国A股市场行情(附源代码)
  7. Android屏幕解锁和点亮
  8. KETTLE 下载网址
  9. iredmail邮件服务器安装流程
  10. Ceph分布式存储系列(六):对象存储、块存储、文件存储的区别和优缺点
  11. bzoj3332: 旧试题
  12. 高德地图SDK 配置key
  13. linux_study_1
  14. [ZT]一个三十岁男人的婚姻思考(三)
  15. 【邻接图】解决图的模板
  16. 首月流水3亿的暑期档黑马,被外挂所困扰
  17. 宋宝华:为什么numactl内存绑定对代码段不起作用
  18. BufferedWriter详解
  19. 五⼤场景玩转 Git,只要这一篇就够了!
  20. Python入门基础(六) 字典

热门文章

  1. 安装QT时遇到:canot start “d:\qt\vcredist\vcredist_x64.exe/norestart/q“:process failed to start :请求的操作需要提升
  2. java倒序输出英文句子_Java实现英文句子中的单词顺序逆序输出的方法
  3. 质量功能配置(QFD)矩阵
  4. [一起来做动图吧]Animate制作简单动图,包教包会,不会举报
  5. 推荐一款(网站图片储存)网站图片外链
  6. unity3D的FingerGestures插件详细说明
  7. python学习之心路历程
  8. Kaka集群生产者消费者使用实例(二)
  9. 2021高考倒计时HTML源码,2021高考倒计时
  10. 【设计模式】模板方法模式