C# WinForm分页控件实现与使用详解
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开发中实现分页功能有所帮助!