C# Winform自定义的UI分页控件

news/2024/12/22 20:10:46/

效果展示:

自定义控件源代码:

using System;
using System.Drawing;
using System.Windows.Forms;
using static NPOI.HSSF.Util.HSSFColor;namespace TestSystemManager
{public class PaginationControl : UserControl{// 事件:当页码切换时触发public event EventHandler<int> PageChanged = null!;// 当前页码private int _currentPage = 1;public int CurrentPage{get => _currentPage;set{if (value >= 1 && value <= TotalPages){_currentPage = value;Console.WriteLine($"CurrentPage updated to: {_currentPage}"); // 调试输出UpdatePagination();}}}// 总页数private int _totalPages = 1;public int TotalPages{get => _totalPages;set{_totalPages = value > 0 ? value : 1;UpdatePagination();}}// 布局面板private FlowLayoutPanel flowLayoutPanel;// 每页显示的最大按钮数量private int MaxButtons => this.Width / 50; // 按钮宽度约50像素// 分页控件初始化public PaginationControl(){this.Height = 60; // 增加高度this.AutoSize = true;// 初始化 FlowLayoutPanelflowLayoutPanel = new FlowLayoutPanel{Dock = DockStyle.Fill,AutoSize = true,FlowDirection = FlowDirection.LeftToRight,WrapContents = false,Padding = new Padding(10)};this.Controls.Add(flowLayoutPanel);// 响应控件大小调整this.Resize += (s, e) => UpdatePagination();}// 更新分页显示private void UpdatePagination(){flowLayoutPanel.Controls.Clear(); // 清除控件if (TotalPages <= 1)return;// 计算需要显示的页码范围int maxButtons = MaxButtons; // 最多显示按钮数量int startPage = Math.Max(1, CurrentPage - maxButtons / 2);int endPage = Math.Min(TotalPages, startPage + maxButtons - 1);if (endPage - startPage + 1 < maxButtons){startPage = Math.Max(1, endPage - maxButtons + 1);}// 调试输出页码范围Console.WriteLine($"startPage: {startPage}, endPage: {endPage}, CurrentPage: {CurrentPage}");// 添加省略号前的页码按钮if (startPage > 1){flowLayoutPanel.Controls.Add(CreateButton("1", true, () => CurrentPage = 1));if (startPage > 2){// 添加“上一页”按钮flowLayoutPanel.Controls.Add(CreateButton("<<", CurrentPage > 1, () => CurrentPage = Math.Max(1, CurrentPage - 1)));}}// 添加可见的页码按钮for (int i = startPage; i <= endPage; i++){var isCurrent = i == CurrentPage;flowLayoutPanel.Controls.Add(CreateButton(i.ToString(), !isCurrent, () => CurrentPage = i));}// 添加省略号后的页码按钮if (endPage < TotalPages){if (endPage < TotalPages - 1){// 添加“下一页”按钮flowLayoutPanel.Controls.Add(CreateButton(">>", CurrentPage < TotalPages, () => CurrentPage = Math.Min(TotalPages, CurrentPage + 1)));}flowLayoutPanel.Controls.Add(CreateButton(TotalPages.ToString(), true, () => CurrentPage = TotalPages));}flowLayoutPanel.Invalidate(); // 强制刷新}// 创建按钮private Krypton.Toolkit.KryptonButton CreateButton(string text, bool isEnabled, Action onClick){var button = new Krypton.Toolkit.KryptonButton{Text = text,Enabled = isEnabled,Width = 40, // 设置按钮宽度Height = 30, // 设置按钮高度Margin = new Padding(5),ForeColor = isEnabled ? Color.Black : Color.Gray,BackColor = isEnabled ? Color.White : Color.LightGray,Tag = text};button.StateCommon.Back.Color1 = Color.FromArgb(255, 224, 192);button.StateCommon.Back.Color2 = Color.FromArgb(128, 255, 128);if (isEnabled){button.Click += (s, e) =>{// 确保事件逻辑只针对当前按钮if (button.Tag.ToString() != ">>" && button.Tag.ToString() != "<<"){int clickedPage = int.Parse(button.Tag.ToString()!);CurrentPage = clickedPage;PageChanged?.Invoke(this, CurrentPage);}};}return button;}// 创建省略号标签private Label CreateEllipsis(){return new Label{Text = "...",AutoSize = true,Margin = new Padding(5),TextAlign = ContentAlignment.MiddleCenter,ForeColor = Color.Gray};}}
}

UI窗体实现分页控件展示代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace TestSystemManager
{public partial class DataBaseDataManager_TestData_WinFrm : Form{private PaginationControl pagination = null!;private string testWebApi = string.Empty;public DataBaseDataManager_TestData_WinFrm(string testWebApi){InitializeComponent();this.testWebApi = testWebApi;//创建分页控件this.pagination = new PaginationControl {TotalPages = 93, // 设置总页数Dock = DockStyle.Bottom // 自动停靠在底部};// 绑定 PageChanged 事件this.pagination.PageChanged += Pagination_PageChanged!;// 添加到窗体this.splitContainer2.Panel2.Controls.Add(this.pagination);// 响应父容器大小调整this.splitContainer2.Panel2.Resize += (s, e) =>{this.pagination.Width = this.splitContainer2.Panel2.Width;};}#region 处理页码切换事件private void Pagination_PageChanged(object sender, int currentPage){MessageBox.Show($"您单击了第 {currentPage} 页", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}#endregion}
}


http://www.ppmy.cn/news/1557278.html

相关文章

图像的向量量化技术

创建嵌入矩阵的过程其实是将离散的索引&#xff08;如单词索引、图像特征的类别标签等&#xff09;映射到一个连续的向量空间&#xff0c;这个向量空间由一个嵌入矩阵来表示。在图像数据的背景下&#xff0c;我们可以通过神经网络将图像数据表示成离散的“类别”索引&#xff0…

如何在 Windows 11 中修改 Hosts 文件

hosts 文件是一个存储在计算机上的文本文件&#xff0c;它包含了一些 IP 地址和域名的映射。操作系统在访问网站时&#xff0c;首先会检查 hosts 文件&#xff0c;看看是否有任何需要手动指定的 IP 地址。如果文件中存在相应的映射记录&#xff0c;操作系统将直接使用 hosts 文…

Oracle virTualBox安装window10

一、下载windows10镜像 我下载的windows10镜像如下&#xff1a; 内部文件如下&#xff1a; 二、错误的安装方法 直接新建虚拟机&#xff0c;选择镜像文件&#xff1a; 启动虚拟机&#xff08;会一直提示没有启动设备&#xff0c;选择镜像后一直弹窗提示&#xff09; 三、正确…

【Http,Netty,Socket,WebSocket的应用场景和区别】

Http&#xff0c;Netty&#xff0c;Socket&#xff0c;WebSocket的应用场景和区别 Http、Netty、Socket、WebSocket都是网络通信领域中的重要技术和工具&#xff0c;它们在应用场景和特性上有所区别。以下是对这四种技术和工具的应用场景及区别的详细分析&#xff1a; Http的…

Redis性能调优:深入剖析变慢原因及应对策略

如果观察到&#xff0c;这个实例的运行延迟是正常 Redis 基准性能的 2 倍以上&#xff0c;即可认为这个 Redis 实例确实变慢了。 1.如何查看实例的运行延迟 &#xff08;1&#xff09;redis-cli -h 127.0.0.1 -p 6379 --intrinsic-latency 60 执行该命令&#xff0c;就可以测…

深度学习网络训练及部署环节相关工具

数据可视化&#xff1a; matplotlib:可视化库seaborn:统计数据可视化模块 网络构建 网络编译&#xff1a; 网络训练&#xff1a; tqdm:进度条模块 模型可解释性 CAM:类别激活映射图 Saliency Maps:显著图 SmoothGrad:效果更好的显著图 GLIME:LIME方法的改进 网络评估…

CPU性能优化--函数分组

热点函数可以被分组到一起以进一步提升CPU前端缓存的利用率&#xff0c;当热点函数被分组在一起时候&#xff0c;他们可能会共用相同的缓存行&#xff0c;这会减少CPU需要读取的缓存行数量。 图44给出了被分组函数foo,bar和zoo的图形化展示。默认布局需要读取四个缓存行&#x…

solon 集成 activemq-client (sdk)

原始状态的 activemq-client sdk 集成非常方便&#xff0c;也更适合定制。就是有些同学&#xff0c;可能对原始接口会比较陌生&#xff0c;会希望有个具体的示例。 <dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-client&l…