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

相关推荐
历程里程碑14 小时前
43. TCP -2实现英文查中文功能
java·linux·开发语言·c++·udp·c#·排序算法
月巴月巴白勺合鸟月半14 小时前
一次PDF文件的处理(二)
pdf·c#
摆烂的少年15 小时前
Asp .net web应用程序使用VS2022调试时打开文件选择器服务自动关闭问题
c#·.net
William_cl16 小时前
C# ASP.NET Identity 授权实战:[Authorize (Roles=“Admin“)] 仅管理员访问(避坑 + 图解)
开发语言·c#·asp.net
.NET修仙日记16 小时前
构建社区照护桥梁:.NET Core3.1+MVC社区呼叫系统设计与实现
c#·毕业设计·.net·.net core·社区照护平台
红黑色的圣西罗16 小时前
Lua和C#交互探究记录
c#·lua·交互
八苦1 天前
如何用c# 做 mcp/ChatGPT app
c#·mcp
人工智能AI技术1 天前
DeskClaw Windows上线|C#开发AI桌面助手,轻量内核源码解析
人工智能·c#
似水明俊德1 天前
04-C#.Net-委托和事件-面试题
java·开发语言·面试·c#·.net
程序员老乔1 天前
Java 新纪元 — JDK 25 + Spring Boot 4 全栈实战(二):Valhalla落地,值类型如何让电商DTO内存占用暴跌
java·spring boot·c#