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

相关推荐
好望角雾眠6 小时前
第四阶段C#通讯开发-9:网络协议Modbus下的TCP与UDP
网络·笔记·网络协议·tcp/ip·c#·modbus
我是苏苏8 小时前
C#基础:如何从现有类库复制一个新的类库,并且加入解决方案
开发语言·c#
Jackson@ML12 小时前
用Visual Studio Code最新版开发C#应用程序
ide·vscode·c#
她说彩礼65万13 小时前
C# 代理模式
开发语言·c#·代理模式
张人玉16 小时前
TCP 的三次握手和四次挥手
网络·tcp/ip·c#
曹牧16 小时前
C#:三元运算符
开发语言·c#
m0_7482480219 小时前
C++与C#布尔类型深度解析:从语言设计到跨平台互操作
c++·stm32·c#
LeonDL16820 小时前
【通用视觉框架】基于C#+VisionPro开发的视觉框架软件,全套源码,开箱即用
人工智能·c#·visionpro·通用视觉框架·机器视觉框架·视觉框架软件·机器视觉软件
一抓掉一大把21 小时前
RuoYi .net-实现商城秒杀下单(redis,rabbitmq)
redis·mysql·c#·rabbitmq·.net
睡前要喝豆奶粉1 天前
在.NET Core Web Api中使用阿里云OSS
阿里云·c#·.netcore