LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

WinForm 自定义分页控件,解决大数据量展示难题

admin
2025年6月21日 10:21 本文热度 18

前言

在数据驱动的应用程序中,分页功能是提升用户体验的核心组件之一。传统 WinForm并未提供开箱即用的分页控件,开发往往需要自行实现分页逻辑与交互设计。

本文将介绍一个基于 WinForm的高度可定制分页控件CPPageComponent,它支持动态页码生成、跳转、每页条目数选择等功能,并提供了丰富的样式配置选项。

#WinForm开发技巧

#WinForm自定义控件

功能概述

CPPageComponent 继承自FlowLayoutPanel,通过动态布局实现以下核心功能:

1、分页导航:上一页/下一页按钮、直接页码跳转。

2、动态页码渲染:根据总页数自动生成页码标签,支持省略号折叠。

3、自定义样式:选中页背景/字体颜色、悬停效果、边框样式。

4、每页条目选择:通过弹出菜单(Popup)选择每页显示数量(10/20/50/100)。

5、事件通知:提供PageEvent事件,通知外部当前页码和每页大小变化。

控件效果

效果1

效果2

控件说明

1、分页逻辑与属性

控件通过PageSize(每页条目数)、PageIndex(当前页)、SumPage(总条目数)管理分页状态。关键方法SetPage(int page)初始化分页元素:

public void SetPage(int page) {
    this.Controls.Clear();
    // 生成上一页、页码标签、下一页、跳转输入框等控件
    // ...
}

DealPage(int SumPage)根据总页数动态生成页码标签。当总页数超过6时,采用1 ... 3 4 5 ... N的省略模式,优化显示效果。

2、动态页码生成

通过DealPage方法创建页码标签(Label),并绑定点击事件:

private void DealPage(int SumPage) {
    if (page < 7) {
        // 生成连续页码
    } else {
        // 生成带省略号的页码(1 ... 3 4 5 ... 10)
    }
    // 绑定标签点击事件
    label.Click += Label_Click;
}

标签的Tag属性存储实际页码,点击时通过PrePage方法更新当前页并触发事件。

3、样式与交互

颜色自定义:通过属性如CP_PageCheckBackColor设置选中页背景色,利用MouseEnter/MouseLeave事件实现悬停效果。

边框绘制:重写OnPaint方法,使用ControlPaint.DrawBorder绘制统一边框。

private void page_Painit(object? sender, PaintEventArgs e) {
    ControlPaint.DrawBorder(e.Graphics, control.ClientRectangle, 
        borderColor, 1, ButtonBorderStyle.Solid, ...);
}

4、每页条目选择

通过Popup类实现下拉菜单,用户选择后更新PageSize并刷新分页:

private void DropPage() 
{
    // 创建下拉标签和弹出面板
    Drop.Click += Drop_Click; 
    // 显示Popup
    // Popup内标签点击更新PageSize
}

Popup控件封装了动画效果和自适应尺寸,提升用户体验。

5、事件通信

定义PageEvent事件,当页码或每页大小变化时通知外部:

public event CPPageEventHandler PageEvent;
// 触发示例
PageEvent?.Invoke(thisnew PageEventArgs(currentPage, PageSize));

控件代码

/*
 * 作者:pengyan zhang
 * 邮箱:3073507793@qq.com
 * 博客:https://www.cnblogs.com/zpy1993-09
 * 时间:2024-04-12 18:36
 */

publicpartialclassCPPageComponent : FlowLayoutPanel
{
    #region 事件
    /// <summary>
    /// 委托
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public delegate void CPPageEventHandler(object sender, PageEventArgs e);
    /// <summary>
    /// 开关状态发生改变时引发的事件
    /// </summary>
    publicevent CPPageEventHandler PageEvent;
    #endregion
    /// <summary>
    /// 当点击某一页被选中时
    /// </summary>
    [Category("SimpleUI"), Description("被选中时的背景颜色"), DefaultValue(typeof(Color), "0, 159, 149")]
    public  Color CP_PageCheckBackColor
    {
        get { return PageCheckBackColor; }
        set { PageCheckBackColor = value; }
    }
    private Color PageCheckBackColor = Color.FromArgb(0159149);
    /// <summary>
    /// 当某一页未被选中时的背景颜色
    /// </summary>
    [Category("SimpleUI"), Description("未被选中时的背景颜色"), DefaultValue(typeof(Color), "255, 255, 255")]
    public  Color CP_PageUnCheckBackColor
    {
        get { return PageUnCheckBackColor; }
        set { PageUnCheckBackColor = value; }
    }
    private Color PageUnCheckBackColor = Color.FromArgb(255255255);
    /// <summary>
    /// 当某一页被选中时字体颜色
    /// </summary>
    [Category("SimpleUI"), Description("被选中时的字体颜色"), DefaultValue(typeof(Color), "255, 255, 255")]
    public  Color CP_PageCheckFontColor
    {
        get { return PageCheckBackColor; }
        set { PageCheckBackColor = value; }
    
    }
    private Color PageCheckFontColor= Color.FromArgb(255255255);
    /// <summary>
    /// 当某一页未被选中的字体颜色
    /// </summary>
    [Category("SimpleUI"), Description("未被选中时的字体颜色"), DefaultValue(typeof(Color), "0, 0,0")]
    public  Color CP_PageUnCheckFontColor
    {
        get { return PageUnCheckBackColor; }
        set { PageUnCheckBackColor = value; }
    }
    private Color PageUnCheckFontColor = Color.FromArgb(000);
    /// <summary>
    /// 当鼠标进入某一页时
    /// </summary>
    [Category("SimpleUI"), Description("鼠标进入时的背景颜色"), DefaultValue(typeof(Color), "224, 224, 224")]
    public  Color CP_ageEneterColor
    {
        get { return PageEneterColor; }
        set { PageEneterColor = value; }
    }
    private Color PageEneterColor= Color.FromArgb(224224224);
    private Label labelLastPage { getset; }
    private Label labelNextPage { getset; }
    private TextBox PageBox { getset; }
    private Label CurrentPageControl { getset; }
    private Label labelLeft { getset; }
    private Label labelRight { getset; }
    private List<Label> pages {  getset; }
    privateint page { getset; } = 0;
    privateint PageSize { getset; } = 10;
    privateint PageIndex { getset; } = 1;
    privateint SumPage { getset; }
    private Label label_StartPage { getset; }
    private Label label_EndPage { getset; }
    privateint[] PageArr { getset; } = new[] { 102050100 };
    private FlowLayoutPanel flowLayoutPanel { getset; }
    private Label Drop { get;set; }
    private Popup pop { getset; } 
    public CPPageComponent()
    {
        InitializeComponent();
    }
    public CPPageComponent(IContainer container)
    {
        container.Add(this);
        InitializeComponent();
      
    }
    private void page_Painit(object? sender, PaintEventArgs e)
    {
        Control control = sender as Control;
        ControlPaint.DrawBorder(e.Graphics,//获取进行绘制的图形
       new Rectangle(00, control.Width, control.Height),//绘制控件所在工作区域
        Color.FromArgb(224224224), 1, ButtonBorderStyle.Solid,//边框类型,选择实线边框,也有虚线等种类;下面这四个重复的传参是设置工作区上下左右边框的功能
        Color.FromArgb(224224224), 1, ButtonBorderStyle.Solid,
        Color.FromArgb(224224224), 1, ButtonBorderStyle.Solid,
        Color.FromArgb(224224224), 1, ButtonBorderStyle.Solid);
    }
    protected override void OnResize(EventArgs ea)
    {
        this.Height = 31;
        base.OnResize(ea);
    }
    private void Label_Click(object? sender, EventArgs e)
    {
        var label = sender as Label;
        if ((int)label.Tag == (int)CurrentPageControl.Tag) return;
        int currentpage = (int)label.Tag;
        this.PageIndex= currentpage;
        PrePage(currentpage, label);
    }
    private void label_MouseEnter_Click(object? sender, EventArgs e)
    {
        var label = sender as Label;
        if (CurrentPageControl != label)
        {
            label.Cursor = Cursors.Hand;
            label.BackColor = PageEneterColor;
        }
    }
    private void label_MouseLeave_Click(object? sender, EventArgs e)
    {
        var label = sender as Label;
        if (CurrentPageControl != label) label.BackColor = PageUnCheckBackColor;
    }
    private void Pagebox_TextChanged(object? sender, EventArgs e)
    {
        PageBox.Text = Regex.Replace(PageBox.Text, "[^0-9]""");
        if (PageBox.Text == "0") PageBox.Text = "";
    }
    private void label_Sure_MouseEnter_Click(object? sender, EventArgs e)
    {
        var label = sender as Label;
        label.Cursor = Cursors.Hand;
        label.BackColor = PageEneterColor;
        label.ForeColor = PageUnCheckFontColor;
    }
    private void label_Sure_MouseLeave_Click(object? sender, EventArgs e)
    {
        var label = sender as Label;
        label.BackColor = PageUnCheckBackColor;
    }
    private void label_Sure_Click(object? sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(PageBox.Text)) return;
        int pageCount = int.Parse(PageBox.Text);
        PageSure(pageCount);
    }
    private void labelNextPage_MouseEnter_Click(object? sender, EventArgs e)
    {
        var label = sender as Label;
        if ((int)CurrentPageControl.Tag == page) label.Cursor = Cursors.No;
        else
        {
            label.Cursor = Cursors.Hand;
            label.BackColor = PageEneterColor;
        }
    }
    private void labelNextPage_MouseLeave_Click(object? sender, EventArgs e)
    {
        var label = sender as Label;
        label.BackColor = PageUnCheckBackColor ;
    }
    private void labelNextPage_Click(object? sender, EventArgs e)
    {
        if ((int)CurrentPageControl.Tag == page)  return;
        if ((int)CurrentPageControl.Tag == page-1 && page > 6)
        {
            CurrentPageControl.BackColor = PageUnCheckBackColor;
            CurrentPageControl.ForeColor = PageUnCheckFontColor;
            CurrentPageControl = label_EndPage;
            CurrentPageControl.BackColor = PageCheckBackColor;
            CurrentPageControl.ForeColor = PageUnCheckFontColor;
            return;
        }
        for (int i = 0; i < pages.Count; i++)
        {
            if ((int)CurrentPageControl.Tag + 1 == (int)pages[i].Tag){ PrePage((int)CurrentPageControl.Tag+1, pages[i]); break;}
        }
        
    }
    private void LastPage_MouseEnter_Click(object? sender, EventArgs e)
    {
        var label = sender as Label;
        if ((int)CurrentPageControl.Tag == 1) label.Cursor = Cursors.No;
        else {label.Cursor = Cursors.Hand;label.BackColor = PageEneterColor;}
       
    }
    private void LastPage_MouseLeave_Click(object? sender, EventArgs e)
    {
        var label = sender as Label;
        label.BackColor = PageUnCheckBackColor;
    }
    private void LastPage_Click(object? sender, EventArgs e)
    {
        if ((int)CurrentPageControl.Tag == 1return;
        if ((int)CurrentPageControl.Tag == 2&&page>6)
        {
            CurrentPageControl.BackColor = PageUnCheckBackColor;
            CurrentPageControl.ForeColor = PageUnCheckFontColor;
            CurrentPageControl = label_StartPage;
            CurrentPageControl.BackColor = PageCheckBackColor;
            CurrentPageControl.ForeColor = PageCheckFontColor;
            return;
        }
        for (int i = 0; i < pages.Count; i++)
        {
            if ((int)CurrentPageControl.Tag - 1 == (int)pages[i].Tag)
            {
                PrePage((int)CurrentPageControl.Tag -1, pages[i]);break;
            }
        }
    }
    /// <summary>
    /// 初始化分页
    /// </summary>
    /// <param name="page"></param>
    public void  SetPage(int page)
    {
       this.Controls.Clear();
        if (page == 0return;
       
        labelLastPage = new Label();
        labelLastPage.AutoSize = false;
        labelLastPage.Size = new Size(6030);
        labelLastPage.Text = "上一页";
        labelLastPage.TextAlign = ContentAlignment.MiddleCenter;
        labelLastPage.BackColor = PageUnCheckBackColor;
        labelLastPage.Margin = new Padding(0020);
        labelLastPage.Paint += page_Painit;
        labelLastPage.Click += LastPage_Click;
        labelLastPage.MouseLeave += LastPage_MouseLeave_Click;
        labelLastPage.MouseEnter += LastPage_MouseEnter_Click;

        this.Controls.Add(labelLastPage);
        DealPage(page);
        labelNextPage = new Label();
        labelNextPage.AutoSize = false;
        labelNextPage.Size = new Size(6030);
        labelNextPage.Text = "下一页";
        labelNextPage.Margin = new Padding(00100);
        labelNextPage.TextAlign = ContentAlignment.MiddleCenter;
        labelNextPage.BackColor = PageUnCheckBackColor;
        labelNextPage.Paint += page_Painit;
        labelNextPage.Click += labelNextPage_Click;
        labelNextPage.MouseLeave += labelNextPage_MouseLeave_Click;
        labelNextPage.MouseEnter += labelNextPage_MouseEnter_Click;

        this.Controls.Add(labelNextPage);

        Label labelLastRange = new Label();
        labelLastRange.AutoSize = false;
        labelLastRange.Size = new Size(4030);
        labelLastRange.Text = "到第";
        labelLastRange.Margin = new Padding(0000);
        labelLastRange.TextAlign = ContentAlignment.MiddleCenter;
        labelLastRange.BackColor = PageUnCheckBackColor;

        this.Controls.Add(labelLastRange);

        PageBox = new TextBox();
        PageBox.Size = new Size(5030);
        PageBox.Margin = new Padding(0200);
        PageBox.Paint += page_Painit;
        PageBox.TextChanged += Pagebox_TextChanged;
        this.Controls.Add(PageBox);

        Label labelRangePage = new Label();
        labelRangePage.AutoSize = false;
        labelRangePage.Size = new Size(3030);
        labelRangePage.Text = "页";
        labelRangePage.Margin = new Padding(0020);
        labelRangePage.TextAlign = ContentAlignment.MiddleCenter;
        labelRangePage.BackColor = PageUnCheckBackColor;
        this.Controls.Add(labelRangePage);

        Label label_Sure = new Label();
        label_Sure.AutoSize = false;
        label_Sure.Size = new Size(5030);
        label_Sure.Text = "确定";
        label_Sure.Margin = new Padding(0020);
        label_Sure.TextAlign = ContentAlignment.MiddleCenter;
        label_Sure.BackColor = PageUnCheckBackColor;
        label_Sure.Paint += page_Painit;
        label_Sure.Click += label_Sure_Click;
        label_Sure.MouseLeave += label_Sure_MouseLeave_Click;
        label_Sure.MouseEnter += label_Sure_MouseEnter_Click;
        this.Controls.Add(label_Sure);

        Label labelSum = new Label();
        labelSum.AutoSize = false;
        labelSum.Size = new Size(8030);
        labelSum.Text = "共 " + page + " 条";
        labelSum.Margin = new Padding(0020);
        labelSum.TextAlign = ContentAlignment.MiddleCenter;
        labelSum.BackColor = PageUnCheckBackColor;
        this.Controls.Add(labelSum);
        DropPage();
    }
    private void DealPage(int SumPage)
    {
        this.SumPage = SumPage;
        page = SumPage % PageSize > 0 ? SumPage / PageSize + 1 : SumPage / PageSize;
        pages = new List<Label>();
        if (page < 7)
        {
            for (int i = 1; i <= page; i++)
            {
                Label label = new Label();
                label.Parent = this;
                label.AutoSize = false;
                label.Size = new Size(3030);
                label.Text = i.ToString();
                label.Tag = i;
                label.Margin = new Padding(0020);
                label.TextAlign = ContentAlignment.MiddleCenter;
                label.BackColor = PageUnCheckBackColor;
                label.Paint += page_Painit;
                label.Click += Label_Click;
                label.MouseLeave += label_MouseLeave_Click;
                label.MouseEnter += label_MouseEnter_Click;
                this.Controls.Add(label);
                pages.Add(label);
            }
            pages[0].BackColor = PageCheckBackColor;
            pages[0].ForeColor = PageCheckFontColor;
            CurrentPageControl = pages[0];
        }
        else
        {
            string[] PageArr = newstring[]
            {
                "1","...","2","3","4","5","6","...",page.ToString()
            };
            for (int i = 0; i < PageArr.Length; i++)
            {
                Label label = new Label();
                label.Parent = this;
                label.AutoSize = false;
                label.Text = PageArr[i];

                if (i == 1)
                {
                    label.Size = new Size(5030);
                    label.Tag = -1;
                    label.BackColor = PageUnCheckBackColor;
                    label.Visible = false;
                    labelLeft = label;
                }
                elseif (i == 7)
                {
                    label.BackColor = PageUnCheckBackColor;
                    label.Size = new Size(5030);
                    label.Tag = 0;
                    labelRight = label;
                }
                else
                {
                    label.Size = new Size(3030);
                    label.Tag = int.Parse(PageArr[i]);
                    label.Click += Label_Click;
                    if (i == 6) label.Visible = false;
                    label.BackColor = PageUnCheckBackColor;
                    label.MouseLeave += label_MouseLeave_Click;
                    label.MouseEnter += label_MouseEnter_Click;
                    if (i > 1 && i < 7) pages.Add(label);
                    if (i == 0)
                    {
                        label.BackColor = PageCheckBackColor;
                        label.ForeColor = PageCheckFontColor;
                        CurrentPageControl = label;
                        label_StartPage = label;
                    }
                    if (i == 8) label_EndPage = label;
                }
                label.Margin = new Padding(0020);
                label.TextAlign = ContentAlignment.MiddleCenter;
                label.Paint += page_Painit;
                this.Controls.Add(label);
            }
        }
     //   if (PageEvent != null) PageEvent.Invoke(CurrentPageControl, new PageEventArgs(1, this.PageSize));
        

    }
    private void DropPage()
    {
        Drop = new Label();
        Drop.AutoSize = false;
        Drop.Size = new Size(6030);
        Drop.Text = this.PageSize.ToString();
        Drop.Tag = this.PageSize;
        Drop.Margin = new Padding(00100);
        Drop.TextAlign = ContentAlignment.MiddleLeft;
        Drop.ImageAlign = ContentAlignment.MiddleRight;
        Drop.Image = Properties.Resources.bottom_pull; 
        Drop.BackColor = PageUnCheckBackColor;
        Drop.Paint += page_Painit;
        Drop.Click += Drop_Click;
        Drop.MouseLeave += Drop_MouseLeave_Click;
        Drop.MouseEnter += Drop_MouseEnter_Click;
        this.Controls.Add(Drop);
        flowLayoutPanel=new FlowLayoutPanel();
        flowLayoutPanel.Width = 60;
        int height = 0;
        for (int i = 0; i < PageArr.Length; i++)
        {
            Label label = new Label();
            label.Tag = PageArr[i];
            label.Text = PageArr[i].ToString() ;
            label.AutoSize = false;
            label.Height = 30;
            label.Width = 60;
            label.TextAlign = ContentAlignment.MiddleCenter;
            label.BackColor = PageUnCheckBackColor;

            label.Click += DropItem_Click;
            label.MouseEnter += Dropitem_MouseEnterClick;
            label.MouseLeave += Dropitem_MouseLeaveClick;
            label.Paint += Drop_Paint;
            height +=30;
            flowLayoutPanel.Controls.Add(label);
        }
        //如果子项的高大于下拉框的4倍高度,某人为4倍高度
        if (height > 30 * 4)
        {
            flowLayoutPanel.Height = 30 * 4;
        }
        else//如果小于4倍高度,那么就等于累计高度
        {
            flowLayoutPanel.Height = height;
        }
    }
    private void Drop_Paint(object? sender, PaintEventArgs e)
    {
        Control control = sender as Control;
        ControlPaint.DrawBorder(e.Graphics,//获取进行绘制的图形
       new Rectangle(00, control.Width, control.Height),//绘制控件所在工作区域
        Color.FromArgb(224224224), 1, ButtonBorderStyle.Solid,//边框类型,选择实线边框,也有虚线等种类;下面这四个重复的传参是设置工作区上下左右边框的功能
        Color.FromArgb(224224224), 1, ButtonBorderStyle.Solid,
        Color.FromArgb(224224224), 1, ButtonBorderStyle.Solid,
        Color.FromArgb(224224224), 1, ButtonBorderStyle.Solid);
    }
    private void Dropitem_MouseLeaveClick(object? sender, EventArgs e)
    {
        var label = sender as Label;
        label.Cursor = Cursors.Hand;
        label.BackColor = PageUnCheckBackColor;
        label.ForeColor = PageUnCheckFontColor;
    }
    private void Dropitem_MouseEnterClick(object? sender, EventArgs e)
    {
        var label = sender as Label;
        label.BackColor = PageCheckBackColor;
        label.ForeColor =PageCheckFontColor;
    }
    private void DropItem_Click(object? sender, EventArgs e)
    {
        var label = sender as Label;
        this.Controls.Clear();
        this.PageSize = (int)label.Tag;
        this.Drop.Text = label.Tag.ToString();
        SetPage(this.SumPage);
         if (PageEvent != null) PageEvent.Invoke(CurrentPageControl, new PageEventArgs(1this.PageSize));

        pop.Close();
    }
    private void Drop_MouseEnter_Click(object? sender, EventArgs e)
    {
        var label = sender as Label;
        label.BackColor = PageEneterColor;
    }
    private void Drop_MouseLeave_Click(object? sender, EventArgs e)
    {
        var label = sender as Label;
        label.Cursor = Cursors.Hand;
        label.BackColor = PageUnCheckBackColor;
        label.ForeColor = PageUnCheckFontColor;
    }
    private void Drop_Click(object? sender, EventArgs e)
    {
        Label label = sender as Label;
    
         pop = new Popup(flowLayoutPanel);
        pop.Show(label);
    }
    /// <summary>
    /// 点击页码或者点击上一页,写一页按钮
    /// </summary>
    /// <param name="currentpage"></param>
    /// <param name="label"></param>
    private void PrePage(int currentpage, Label label)
    {
        CurrentPageControl.BackColor = PageUnCheckBackColor;
        CurrentPageControl.ForeColor = PageUnCheckFontColor;
        if (page < 7) CurrentPageControl = label;
        else
        {
            int count = 0;
            if (currentpage - 1 < 4)
            {
                CurrentPageControl = label;
                if (currentpage == 4 && pages[0].Visible == true)
                {

                    for (int i = 2; i < 6; i++)
                    {
                        pages[count].Tag = i; pages[count].Text = i.ToString();
                        if (i == currentpage) CurrentPageControl = pages[count];
                        count++;
                    }
                }
                if (currentpage <= 3 && labelLeft.Visible == true)
                {
                    for (int i = 2; i < 6; i++)
                    {
                        pages[count].Tag = i; pages[count].Text = i.ToString();
                        if (i == currentpage) CurrentPageControl = pages[1];
                        count++;
                    }
                }
                if (labelLeft.Visible == true) labelLeft.Visible = false;
                if (pages[4].Visible == true) pages[4].Visible = false;
                if (pages[0].Visible == false) pages[0].Visible = true;
                if (labelRight.Visible == false) labelRight.Visible = true;
            }
            else
            {
                if (page - currentpage < 4)
                {
                    CurrentPageControl = label;
                    if (page - currentpage == 3 && labelRight.Visible == true)
                    {
                        if (pages[4].Visible == false) pages[4].Visible = true;
                        for (int i = currentpage - 2; i < currentpage + 3; i++)
                        {
                            pages[count].Tag = i; pages[count].Text = i.ToString();
                            if (i == currentpage) CurrentPageControl = pages[count];
                            count++;
                        }
                    }
                    if (pages[0].Visible == false) pages[0].Visible = true;
                    if (page - currentpage == 3 && labelRight.Visible == false)
                    {
                        for (int i = currentpage - 2; i < currentpage + 3; i++)
                        {
                            pages[count].Tag = i; pages[count].Text = i.ToString();
                            if (count == 2) CurrentPageControl = pages[2];
                            count++;
                        }
                    }
                    if (page - currentpage < 3)
                    {
                        if (pages[0].Visible == true) pages[0].Visible = false;
                        if (pages[4].Visible == false) pages[4].Visible = true;
                        for (int i = page - 5; i < page; i++)
                        {
                            pages[count].Tag = i; pages[count].Text = i.ToString();
                            if (i == currentpage) CurrentPageControl = pages[count];
                            count++;
                        }
                    }
                    if (labelLeft.Visible == false) labelLeft.Visible = true;
                    if (labelRight.Visible == true) labelRight.Visible = false;
                }
                else
                {
                    if (pages[0].Visible == false) pages[0].Visible = true;
                    if (pages[4].Visible == false) pages[4].Visible = true;
                    if (labelLeft.Visible == false) labelLeft.Visible = true;
                    if (labelRight.Visible == false) labelRight.Visible = true;
                    for (int i = currentpage - 2; i < currentpage + 3; i++)
                    {
                        pages[count].Tag = i; pages[count].Text = i.ToString();
                        if (i == currentpage) CurrentPageControl = pages[count];
                        count++;
                    }
                }
            }
        }
        CurrentPageControl.BackColor = PageCheckBackColor;
        CurrentPageControl.ForeColor = PageCheckFontColor;
        if (PageEvent != null) PageEvent.Invoke(currentpage,new PageEventArgs((int)label.Tag,this.PageSize));
    }
    /// <summary>
    /// 跳转页,点击跳转到某一页
    /// </summary>
    /// <param name="pageCount"></param>
    private void PageSure(int pageCount)
    {
        if (pageCount > 0 && pageCount <= page)
        {
            CurrentPageControl.BackColor = PageUnCheckBackColor;
            CurrentPageControl.ForeColor = PageUnCheckFontColor;
            if (page < 7)
            {
                pages.ForEach(m => { if ((int)m.Tag == pageCount) CurrentPageControl = m; });
            }
            else
            {
                int count = 0;

                if (pageCount < 5)
                {
                    CurrentPageControl = label_StartPage;
                    for (int i = 2; i < 6; i++)
                    {
                        pages[count].Tag = i; pages[count].Text = i.ToString();
                        if (i == pageCount) CurrentPageControl = pages[count];
                        count++;
                    }
                    if (labelLeft.Visible == true) labelLeft.Visible = false;
                    if (labelRight.Visible == false) labelRight.Visible = true;
                    if (pages[0].Visible == false) pages[0].Visible = true;
                    if (pages[4].Visible == true) pages[4].Visible = false;

                }
                else
                {
                    if (labelRight.Visible == true) labelRight.Visible = false;
                    if (pages[0].Visible == true) pages[0].Visible = false;
                    if (pages[4].Visible == false) pages[4].Visible = true;
                    //如果选中的是最后一页
                    CurrentPageControl = label_EndPage;

                    if (page - pageCount <= 3)
                    {
                        if (page - pageCount == 3if (pages[0].Visible == false) pages[0].Visible = true;
                        for (int i = page - 5; i < page; i++)
                        {
                            pages[count].Tag = i; pages[count].Text = i.ToString();
                            if (i == pageCount) CurrentPageControl = pages[count];
                            count++;
                        }
                    }
                    else
                    {
                        for (int i = pageCount - 2; i < pageCount + 3; i++)
                        {
                            pages[count].Tag = i; pages[count].Text = i.ToString();
                            if (i == pageCount) CurrentPageControl = pages[count];
                            count++;
                        }
                        if (labelRight.Visible == false) labelRight.Visible = true;
                        if (pages[0].Visible == false) pages[0].Visible = true;
                        if (pages[4].Visible == false) pages[4].Visible = true;
                    }
                    if (labelLeft.Visible == false) labelLeft.Visible = true;
                }
            }
        }
        else PageBox.Text = "";
        CurrentPageControl.BackColor = PageCheckBackColor;
        CurrentPageControl.ForeColor = PageCheckFontColor;
        if (PageEvent != null) PageEvent.Invoke(CurrentPageControl, new PageEventArgs(pageCount, this.PageSize));

    }
}

总结

高度可定制:通过属性暴露样式配置,适应不同场景需求。

交互友好:动态页码折叠、悬停反馈、动画弹出菜单提升易用性。

解耦设计:通过事件通知分页状态变化,便于与数据层集成。


阅读原文:原文链接


该文章在 2025/6/23 14:48:50 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved