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 小时前
Unity学习90天-第2天-认识键盘 / 鼠标输入(PC)并实现WASD 移动,鼠标控制物体转向
学习·unity·c#·游戏开发
William_cl1 小时前
C# ASP.NET 分层架构实战:BLL (Service) 业务层从入门到封神(规范 + 避坑)
架构·c#·asp.net
qq_454245033 小时前
图数据标准化与智能去重框架:设计与实现解析
数据结构·架构·c#·图论
CSharp精选营3 小时前
C# 如何减少代码运行时间:7 个实战技巧
性能优化·c#·.net·技术干货·实战技巧
hhh3u3u3u16 小时前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
加号316 小时前
【C#】实现沃德普线光控制器通信控制(附完整源码)
开发语言·c#
lzhdim17 小时前
SharpCompress:跨平台的 C# 压缩与解压库
开发语言·c#
~plus~19 小时前
.NET 8 C# 委托与事件实战教程
网络·c#·.net·.net 8·委托与事件·c#进阶
beyond谚语20 小时前
接口&抽象类
c#·接口隔离原则·抽象类
新手小新20 小时前
C#学习笔记1-在VS CODE部署C#开发环境
笔记·学习·c#