前言
在数据驱动的应用程序中,分页功能是提升用户体验的核心组件之一。传统 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(this, new 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(0, 159, 149);
/// <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(255, 255, 255);
/// <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(255, 255, 255);
/// <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(0, 0, 0);
/// <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(224, 224, 224);
private Label labelLastPage { get; set; }
private Label labelNextPage { get; set; }
private TextBox PageBox { get; set; }
private Label CurrentPageControl { get; set; }
private Label labelLeft { get; set; }
private Label labelRight { get; set; }
private List<Label> pages { get; set; }
privateint page { get; set; } = 0;
privateint PageSize { get; set; } = 10;
privateint PageIndex { get; set; } = 1;
privateint SumPage { get; set; }
private Label label_StartPage { get; set; }
private Label label_EndPage { get; set; }
privateint[] PageArr { get; set; } = new[] { 10, 20, 50, 100 };
private FlowLayoutPanel flowLayoutPanel { get; set; }
private Label Drop { get;set; }
private Popup pop { get; set; }
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(0, 0, control.Width, control.Height),//绘制控件所在工作区域
Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid,//边框类型,选择实线边框,也有虚线等种类;下面这四个重复的传参是设置工作区上下左右边框的功能
Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid,
Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid,
Color.FromArgb(224, 224, 224), 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 == 1) return;
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 == 0) return;
labelLastPage = new Label();
labelLastPage.AutoSize = false;
labelLastPage.Size = new Size(60, 30);
labelLastPage.Text = "上一页";
labelLastPage.TextAlign = ContentAlignment.MiddleCenter;
labelLastPage.BackColor = PageUnCheckBackColor;
labelLastPage.Margin = new Padding(0, 0, 2, 0);
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(60, 30);
labelNextPage.Text = "下一页";
labelNextPage.Margin = new Padding(0, 0, 10, 0);
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(40, 30);
labelLastRange.Text = "到第";
labelLastRange.Margin = new Padding(0, 0, 0, 0);
labelLastRange.TextAlign = ContentAlignment.MiddleCenter;
labelLastRange.BackColor = PageUnCheckBackColor;
this.Controls.Add(labelLastRange);
PageBox = new TextBox();
PageBox.Size = new Size(50, 30);
PageBox.Margin = new Padding(0, 2, 0, 0);
PageBox.Paint += page_Painit;
PageBox.TextChanged += Pagebox_TextChanged;
this.Controls.Add(PageBox);
Label labelRangePage = new Label();
labelRangePage.AutoSize = false;
labelRangePage.Size = new Size(30, 30);
labelRangePage.Text = "页";
labelRangePage.Margin = new Padding(0, 0, 2, 0);
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(50, 30);
label_Sure.Text = "确定";
label_Sure.Margin = new Padding(0, 0, 2, 0);
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(80, 30);
labelSum.Text = "共 " + page + " 条";
labelSum.Margin = new Padding(0, 0, 2, 0);
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(30, 30);
label.Text = i.ToString();
label.Tag = i;
label.Margin = new Padding(0, 0, 2, 0);
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(50, 30);
label.Tag = -1;
label.BackColor = PageUnCheckBackColor;
label.Visible = false;
labelLeft = label;
}
elseif (i == 7)
{
label.BackColor = PageUnCheckBackColor;
label.Size = new Size(50, 30);
label.Tag = 0;
labelRight = label;
}
else
{
label.Size = new Size(30, 30);
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(0, 0, 2, 0);
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(60, 30);
Drop.Text = this.PageSize.ToString();
Drop.Tag = this.PageSize;
Drop.Margin = new Padding(0, 0, 10, 0);
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(0, 0, control.Width, control.Height),//绘制控件所在工作区域
Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid,//边框类型,选择实线边框,也有虚线等种类;下面这四个重复的传参是设置工作区上下左右边框的功能
Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid,
Color.FromArgb(224, 224, 224), 1, ButtonBorderStyle.Solid,
Color.FromArgb(224, 224, 224), 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(1, this.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 == 3) if (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 编辑过