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

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

效果展示:

自定义控件源代码:

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;

            // 初始化 FlowLayoutPanel
            flowLayoutPanel = 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.kler.cn/a/446875.html

相关文章:

  • 【Mysql优化】SQL优化最佳实践分析与总结
  • [JavaScript] 我该怎么去写一个canvas游戏
  • aosp15 - Activity生命周期切换
  • 项目搭建+删除(单/批)
  • 关于数据流图绘制和使用上的一些个人经验
  • 王佩丰24节Excel学习笔记——第十二讲:match + index
  • Everything实现,快速搜索文件
  • 宠物管理系统(2):utils
  • LeetCode136. 只出现一次的数字(2024冬季每日一题 38)
  • 基于SpringBoot+layui+html实现电影院售票系统【源码+数据库文件+包部署成功+答疑解惑问到会为止】
  • 相机(Camera)成像原理详解
  • JavaScript中,常用crypto模块进行rsa加密,crypto-js模块进行md5算法
  • 【数据库】SQL语句基础
  • Java中正则表达式的介绍、使用场景及示例代码
  • Java学习,输出数组元素
  • 31.设计模式
  • Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能
  • Java基础面试题17:GenericServlet和HttpServlet有什么区别?
  • 【Java】mac安装Java17(JDK17)
  • 前端数据持久化指南:LocalStorage、SessionStorage 等的区别与应用
  • 从零用java实现 小红书 springboot vue uniapp (4)个人主页优化
  • 首个!艾灵参编的工业边缘计算国家标准正式发布
  • Epic游戏使用mod
  • MySQL通过日志恢复数据的步骤
  • Java中的方法重写:深入解析与最佳实践
  • debian linux 连网自动调整时间 (报错 Unit systemd-timesyncd.service could not be found.)