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

相关推荐
almighty274 小时前
C#实现导入CSV数据到List<T>的完整教程
c#·csv·格式转换·c#导入数据·csv数据导入
程序猿多布5 小时前
Lua和C#比较
c#·lua
csdn_aspnet13 小时前
使用 MongoDB.Driver 在 C# .NETCore 中实现 Mongo DB 过滤器
mongodb·c#·.netcore
csdn_aspnet18 小时前
使用 C# .NETCore 实现MongoDB
mongodb·c#·.netcore
上位机付工19 小时前
上位机通信速度有多快?
开发语言·c#·上位机·plc
FuckPatience1 天前
C# 修改基类List中某一元素的子类类型
c#·list
玉面小君1 天前
从 WPF 到 Avalonia 的迁移系列实战篇6:ControlTheme 和 Style区别
c#·wpf·avalonia
_oP_i1 天前
WinForms 项目里生成时选择“首选目标平台 32 位导致有些电脑在获取office word对象时获取不到
c#·office