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开发中实现分页功能有所帮助!