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.pswp.cn/bicheng/96029.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高级 ACL 有多强?一个规则搞定 “IP + 端口 + 协议” 三重过滤

一、实验拓扑及描述 二、实验需求 1、完成拓扑中各设备的基础配置&#xff0c;使得全网互通&#xff1b; 2、在上一个需求的基础上&#xff0c;在路由器上部署高级ACL&#xff0c;使得Client1无法访问Server的HTTP服务&#xff0c;但是PC1依然能够访问服务器及其他节点&#xf…

支持多材质密度设置的金属重量计算使用指南

传统手工计算各种型材&#xff08;如钢管、角钢、钢板等&#xff09;的重量繁琐且容易出错。 它的体积小巧&#xff0c;不足100KB&#xff0c;运行不占内存&#xff0c;绿色免安装&#xff0c;双击即开&#xff0c;使用便捷。 可计算钢管、钢板、型钢、角钢等常见型材的重量&a…

在Spring Boot中使用H2数据库

好处 程序启动时自动创建数据库数据表。 使用步骤 引入依赖&#xff1a; <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><dependency><groupId&…

Day21_【机器学习—决策树(2)—ID3树 、C4.5树、CART树】

一、ID3 决策树1. 核心思想使用信息增益&#xff08;Information Gain&#xff09;作为特征选择的标准&#xff0c;递归地构建决策树。2. 特征选择标准信息增益&#xff08;IG&#xff09;&#xff1a;选择使信息增益最大的特征进行划分。3. 优点算法简单&#xff0c;易于理解。…

2025计算机视觉新技术

CLIP / BLIP-3 类「视觉-语言大模型」 • 是什么&#xff1a;让网络自己学会“看图说话”&#xff0c;zero-shot 就能分类、检测、检索。 • 能干什么&#xff1a;不写训练代码&#xff0c;直接一句中文 prompt 就把商品图分成 500 类。 • 落地难度&#xff1a;★☆☆&#xf…

[光学原理与应用-431]:非线性光学 - 能生成或改变激光波长的物质或元件有哪些?

要生成或改变激光波长&#xff0c;可依赖增益介质、非线性光学元件、调谐元件及特殊激光器设计&#xff0c;以下是一些关键物质和元件及其作用机制&#xff1a;一、增益介质&#xff1a;波长的“决定者”增益介质是激光器的核心&#xff0c;其原子或分子的能级结构直接决定输出…

接口权限验证有哪些方式

接口权限验证是保障 API 安全的核心机制&#xff0c;常见的方式有以下几类&#xff0c;适用于不同场景和安全需求&#xff1a; 1. 基于令牌&#xff08;token&#xff09;的验证 &#xff08;1&#xff09;JWT&#xff08;JSON Web Token&#xff09; 原理&#xff1a; 服务器验…

Go开发的自行托管代理加速服务:支持Docker与GitHub加速

HubProxy&#xff1a;一站式解决Docker与GitHub访问难题的轻量级代理服务作为开发者&#xff0c;我们经常遇到这些问题&#xff1a;Docker镜像拉取速度慢得让人抓狂&#xff0c;GitHub Release文件下载到一半断开&#xff0c;或者某些境外容器仓库完全无法访问。最近发现的hubp…

用Python打造逼真的照片桌面:从拖拽到交互的完整实现

在这个数字化时代&#xff0c;我们经常需要处理大量的照片和图片文件。今天我将带你一步步实现一个功能丰富的照片桌面程序&#xff0c;让你可以像在真实桌面上摆放照片一样操作数字图片。这个程序使用wxPython构建&#xff0c;支持拖拽、调整大小、删除等交互功能。C:\pythonc…

《sklearn机器学习——模型的持久性》joblib 和 pickle 进行模型保存和加载

模型持久性在 Scikit-learn 中的应用详解 模型持久性的基本概念 在机器学习领域&#xff0c;模型持久性是指将训练好的模型保存到磁盘或数据库中&#xff0c;以便在后续的预测任务中能够直接使用&#xff0c;而无需重新训练模型。这一过程不仅提高了模型的可重用性&#xff0c;…

前端-组件化开发

目录 一.组件化 二.根组件 三.App.vue文件&#xff08;单文件组件&#xff09;的三个组成部分 四.普通组件的注册和使用&#xff1a; 1.普通组件的创建 2.局部注册 3.全局注册 &#x1f9e0; 补充小技巧&#xff1a; &#x1f4a1; 关于组件名&#xff08;第一个参数&…

UNIX/macOS路由表查询原理与实现

&#x1f310; UNIX/macOS路由表查询原理与实现&#x1f4cc; 功能全景图 #mermaid-svg-mz6rxrQ73xinNsqc {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mz6rxrQ73xinNsqc .error-icon{fill:#552222;}#mermaid-svg…

Python爬虫实战:研究Style sheets模块,构建电商平台笔记本电脑销售数据采集和分析系统

1. 引言 1.1 研究背景 在数字经济时代,互联网蕴含的海量数据已成为企业决策与学术研究的核心资源。网络爬虫技术通过自动化请求、解析网页,能够高效提取公开数据,为市场分析、竞品研究等场景提供基础支撑。Python 凭借其丰富的生态库(如 Requests、BeautifulSoup、Pandas…

lesson55:CSS导航组件全攻略:从基础导航条到动态三级菜单与伸缩菜单实现

目录 一、CSS导航条&#xff1a;构建基础导航系统 1.1 语义化HTML结构 1.2 现代Flexbox布局实现 1.3 核心技术解析 二、三级菜单&#xff1a;构建多层级导航体系 2.1 嵌套HTML结构 2.2 多级菜单CSS实现 2.3 关键技术解析 三、伸缩菜单&#xff1a;实现动态交互导航 3…

Linux基础知识(二)

文件操作1. 怎么理解 I/O 重定向&#xff1f; 2. /dev/null 是什么&#xff0c;有什么用途&#xff1f; 3. 解释下列命令的结果&#xff1a;&> /dev/null 、2>> file 4. 怎么理解管道&#xff1f;管道和重定向有什么区别&#xff1f; 5. 在什么情况下需要使用 tee…

Ribbon和LoadBalance-负载均衡

Ribbon和LoadBalance-负载均衡 Ribbon 和 Spring Cloud LoadBalancer (SCL) 都是 Spring Cloud 生态中实现客户端负载均衡的核心组件&#xff0c;但它们在定位、架构、实现和功能上有显著区别。以下是详细的对比分析&#xff1a; ​1. 核心定位与背景​​Ribbon:​​起源于 ​N…

【数据可视化-107】2025年1-7月全国出口总额Top 10省市数据分析:用Python和Pyecharts打造炫酷可视化大屏

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

Java中的字符串

字符串 String Java编译器对String类型有特殊处理&#xff0c;可用使用"…"来表示一个字符串。实际上字符串在String内部是通过一个数组表示的。 Java中字符串的一个重要特点是不可变。这种不可变性是通过内部的private final char[]字段&#xff0c;以及没有任何修改…

ragflow MCP 调用核心提示词解析:逻辑闭环与优化方向

大家好&#xff5e;我是你们的提示词工程师朋友&#xff0c;今天想跟大家聊聊开源项目 ragflow 里&#xff0c;MCP调用体系中的两个关键提示词。最近在研究调用工具和提示词撰写之间的平衡态。这俩家伙在信息处理和问题解决里作用不小&#xff0c;既有让人眼前一亮的优势✨&…

从基础功能到自主决策, Agent 开发进阶路怎么走?

Agent 开发进阶路线 基础功能开发 环境感知与数据采集&#xff1a;传感器集成、数据预处理&#xff08;滤波、归一化&#xff09;、多模态数据融合简单规则引擎&#xff1a;基于if-then的逻辑决策树、状态机实现基础行为控制基础交互能力&#xff1a;语音识别/TTS集成、基础对话…