当前位置: 首页 > ds >正文

C# WinForm分页控件实现与使用详解

C# WinForm分页控件实现与使用详解

概述

在WinForms应用程序开发中,数据分页是常见的需求。本文将介绍如何实现一个功能完整的分页控件,并在窗体中如何使用该控件进行数据分页展示。

分页控件实现

核心属性与字段

public partial class PageControl : UserControl
{public int currentPage = 1;          // 当前页码public int pageSize = 20;            // 每页数据量public int totalCount = 0;           // 总数据条数public int TotalPages = 0;           // 总页数private BindingSource bindingSource = new BindingSource();public delegate void ShowDataDelegate();  // 数据展示委托public ShowDataDelegate showDataDelegate; // 委托实例public bool isOK = false;            // 控件就绪标志
}

控件初始化

public PageControl()
{this.InitializeComponent();// 初始化每页显示数量选项this.comboBoxPageSize.Items.AddRange(new object[5]{(object) 20,(object) 50,(object) 80,(object) 100,(object) 150});this.comboBoxPageSize.SelectedIndex = 0;
}

页面导航功能

private void NavigateTo(int page)
{if (isOK){if (page < 1 || page > this.TotalPages)return;this.currentPage = page;}
}// 页面跳转按钮事件处理
private void btnFirst_Click(object sender, EventArgs e) 
{ this.NavigateTo(1); showDataDelegate(); 
}private void btnPrevious_Click(object sender, EventArgs e)
{this.NavigateTo(this.currentPage - 1);showDataDelegate();
}private void btnNext_Click(object sender, EventArgs e) 
{this.NavigateTo(this.currentPage + 1); showDataDelegate(); 
}private void btnLast_Click(object sender, EventArgs e) 
{ this.NavigateTo(this.TotalPages); showDataDelegate(); 
}

页码输入处理

private void BtnGo_Click(object sender, EventArgs e)
{int result;if (int.TryParse(this.txtGoPage.Text, out result)){this.NavigateTo(result);showDataDelegate();}else{MessageBox.Show("非法字符!");}
}// 限制只能输入数字和回退键
private void txtGoPage_KeyPress(object sender, KeyPressEventArgs e)
{if (!char.IsDigit(e.KeyChar) && e.KeyChar != '\b')e.Handled = true;if (e.KeyChar != '\r')return;this.BtnGo_Click(sender, (EventArgs)e);
}

页面信息更新

public void UpdatePageInfo()
{this.TotalPages = this.totalCount % this.PageSize != 0 ? this.totalCount / this.PageSize + 1 : this.totalCount / this.PageSize;this.lblPageInfo.Text = string.Format("第 {0} 页 / 共 {1} 页(共 {2} 条数据)", this.currentPage, this.TotalPages, this.totalCount);
}

在窗体中使用分页控件

public FrmQRcodeRecordMG()
{InitializeComponent();DgvData.AutoGenerateColumns = false;ShowDgvSetting();// 初始化下拉框CmbFaild.DisplayMember = "Value";CmbFaild.ValueMember = "Key";CmbFaild.DataSource = dicHeader.ToList();CmbFaild.SelectedIndex = 0;// 绑定分页控件事件pageControl1.showDataDelegate += new PageControl.ShowDataDelegate(PageQuery);pageControl1.isOK = true;
}

分页查询实现

private void PageQuery()
{if (this.InvokeRequired){this.Invoke(new System.Action(() => { PageQuery(); }));return;}try{ConditionalType conditionalType = ConditionalType.Like;Dictionary<string, object> dic = new Dictionary<string, object>();// 调用服务层获取分页数据allData = QRCodeService.GetPageDataByDic(pageControl1.currentPage, pageControl1.pageSize, ref pageControl1.totalCount, dic, conditionalType);// 更新分页信息pageControl1.UpdatePageInfo();// 更新DataGridView数据源if (DgvData.DataSource != null){this.BindingContext[DgvData.DataSource].SuspendBinding();}DgvData.DataSource = new List<object>();DgvData.DataSource = allData;this.BindingContext[DgvData.DataSource].ResumeBinding();}catch (Exception ex){CommonFunc.ShowTip(ex.Message);}
}

使用说明

  1. 控件初始化:将PageControl添加到窗体后,需要设置showDataDelegate委托并设置isOK = true

  2. 数据查询:实现分页查询方法,并在其中调用服务层获取数据

  3. 页面更新:获取数据后调用UpdatePageInfo()方法更新分页信息

  4. 数据绑定:将获取的数据绑定到DataGridView或其他数据显示控件

总结

本文介绍了一个功能完整的WinForms分页控件的实现与使用方法。该控件提供了基本的页面导航功能,包括首页、上一页、下一页、末页按钮,页码输入框以及每页显示数量的选择。通过委托机制,实现了控件与具体数据查询逻辑的解耦,使控件具有更好的复用性。

在实际使用中,只需将控件添加到窗体,实现数据查询方法,并将方法绑定到控件的委托上即可轻松实现数据分页功能。这种设计模式使得分页逻辑与业务逻辑分离,提高了代码的可维护性和可扩展性。

希望本文对你在WinForms开发中实现分页功能有所帮助!

http://www.xdnf.cn/news/20521.html

相关文章:

  • B.50.10.09-RPC核心原理与电商应用
  • MATLAB R2025a安装配置及使用教程(超详细保姆级教程)
  • 什么是云手机?
  • Vue3 - Echarts自定义主题引入(Error:ECharts is not Loaded,Error:default ,Error:module)
  • 攻击服务器的方式有哪些,对应的应对策略有哪些?
  • 联邦学习论文分享:Towards Building the Federated GPT:Federated Instruction Tuning
  • Leetcode hot100 最长连续序列
  • rh134第五章复习总结
  • SDRAM详细分析-08 数据手册解读
  • AI + 办公工具 = 应用案例
  • (论文速读)视觉语言模型评价中具有挑战性的选择题的自动生成
  • 大模型推理时的加速思路?
  • RabbitMq 初步认识
  • 自动化运维之ansible
  • LwIP入门实战 — 3 LwIP的网络接口管理
  • HTB devvortex
  • 【混元AIGC+腾讯云智能体+首创Coze核心流思维导图MCP】:打造一个文思通-智能写作助手Agent
  • 深入浅出 JVM 类加载器:分类、双亲委派与打破机制
  • 使用函数调用对整形数组进行排序
  • 贪心算法在医疗影像分割中的应用详解
  • 小型磨床设计cad+三维图+设计说明书
  • 代理连接性能优化:提升网络效率的关键技术与实践
  • 表格识别技术:通过计算机视觉和OCR,实现非结构化表格向结构化数据的转换,推动数字化转型。
  • Python中不定长参数的基础使用
  • 网络基础篇---以太网链路聚合(静态LACP方式)
  • C++ 面试高频考点 LCR 137. 点名 二分查找 题解 每日一题
  • Vue 项目性能优化实战
  • 从零开始学AI——14
  • python打包工具setuptools
  • Golang中逃逸现象, 变量“何时栈?何时堆?”