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);
}
}
使用说明
-
控件初始化 :将PageControl添加到窗体后,需要设置
showDataDelegate
委托并设置isOK = true
-
数据查询:实现分页查询方法,并在其中调用服务层获取数据
-
页面更新 :获取数据后调用
UpdatePageInfo()
方法更新分页信息 -
数据绑定:将获取的数据绑定到DataGridView或其他数据显示控件
总结
本文介绍了一个功能完整的WinForms分页控件的实现与使用方法。该控件提供了基本的页面导航功能,包括首页、上一页、下一页、末页按钮,页码输入框以及每页显示数量的选择。通过委托机制,实现了控件与具体数据查询逻辑的解耦,使控件具有更好的复用性。
在实际使用中,只需将控件添加到窗体,实现数据查询方法,并将方法绑定到控件的委托上即可轻松实现数据分页功能。这种设计模式使得分页逻辑与业务逻辑分离,提高了代码的可维护性和可扩展性。
希望本文对你在WinForms开发中实现分页功能有所帮助!