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);
    }
}

使用说明

  1. 控件初始化 :将PageControl添加到窗体后,需要设置showDataDelegate委托并设置isOK = true

  2. 数据查询:实现分页查询方法,并在其中调用服务层获取数据

  3. 页面更新 :获取数据后调用UpdatePageInfo()方法更新分页信息

  4. 数据绑定:将获取的数据绑定到DataGridView或其他数据显示控件

总结

本文介绍了一个功能完整的WinForms分页控件的实现与使用方法。该控件提供了基本的页面导航功能,包括首页、上一页、下一页、末页按钮,页码输入框以及每页显示数量的选择。通过委托机制,实现了控件与具体数据查询逻辑的解耦,使控件具有更好的复用性。

在实际使用中,只需将控件添加到窗体,实现数据查询方法,并将方法绑定到控件的委托上即可轻松实现数据分页功能。这种设计模式使得分页逻辑与业务逻辑分离,提高了代码的可维护性和可扩展性。

希望本文对你在WinForms开发中实现分页功能有所帮助!

相关推荐
合作小小程序员小小店1 小时前
桌面开发,拼车管理系统开发,基于C#,winform,sql server数据库
开发语言·数据库·sql·microsoft·c#
wangnaisheng3 小时前
【C#】Newtonsoft.Json、System.Text.Json 解析Json串的对比
c#
自由的好好干活17 小时前
使用Qoder编写ztdaq的C#跨平台示例总结
linux·windows·c#·qoder
FuckPatience18 小时前
C# 实现元素索引由1开始的链表
开发语言·链表·c#
我是唐青枫21 小时前
C#.NET 范围与索引(Range、Index)完全解析:语法、用法与最佳实践
c#·.net
烛阴1 天前
从`new()`到`.DoSomething()`:一篇讲透C#方法与构造函数的终极指南
前端·c#
深海潜水员1 天前
【MonoGame游戏开发】| 牧场物语实现 第一卷 : 农场基础实现 (下)
vscode·游戏·c#·.net·monogame
合作小小程序员小小店1 天前
图书管理系统,基于winform+sql sever,开发语言c#,数据库mysql
开发语言·数据库·sql·microsoft·c#
大侠课堂1 天前
C#经典面试题100道
开发语言·c#
时光追逐者2 天前
Visual Studio 2026 现已正式发布,更快、更智能!
ide·c#·.net·visual studio