C# Winform 分页功能的实现

下面是关于C# Winform分页功能实现的完整攻略:

1. 什么是分页功能

分页,在信息管理系统中常见的一种数据查找方式,数据量比较大的时候,把所有数据都一次性请求会导致页面响应时间过长,从而影响用户体验。因此,常规情况下需要对请求的数据进行分页处理,通过分页显示相应的数据,让用户能够更快更方便的查看信息。

2. 分页功能的实现

2.1 数据库存储分页信息

分页功能的实现需要在数据库中存储分页相关的信息,包括每一页显示的数据条数、当前页码等,以及相应的查询条件等。常用的分页方法有两种:

2.1.1 limit 分页

在MySQL数据库中,使用limit分页常规做法是在SQL中添加limit查询条件,如下:

select * from table limit offset, limit

其中offset是查询的起始位置,limit是查询的记录条数。假设当前页码为page,每页显示数据条数为size,则offset = (page - 1) * size。

2.1.2 row_number 分页

在SQL Server数据库中,使用row_number分页常规做法是在查询语句中添加row_number函数和CTE,如下:

with cte as (
    select *, row_number() over (order by [SortColumn]) as rn 
    from [TableName]
)
select * from cte
where rn between (@PageIndex-1)*@PageSize+1 and @PageIndex*@PageSize

其中SortColumn是排序的字段名,PageIndex是当前页码,PageSize是每页显示的数据条数。

2.2 Winform分页控件实现

在Winform中,可以使用DataGridView控件实现分页的功能,也可以自定义分页控件,下面罗列了实现分页的两种方式。

2.2.1 DataGridView控件实现分页

Winform提供了DataGridView控件,可以通过控制其数据源的方式实现数据的分页显示。常规做法是先将所有数据加载到DataTable中,然后根据当前页码和每页显示的数据条数,从DataTable中获取相应的数据,并将其显示在DataGridView上。

示例代码如下:

private void BindData(int pageIndex, int pageSize)
{
    // 假设数据存储在dt中
    int total = dt.Rows.Count;
    int start = (pageIndex - 1) * pageSize;
    int end = start + pageSize > total ? total : start + pageSize;
    DataTable dtPage = dt.Clone();
    for (int i = start; i < end; i++)
    {
        dtPage.Rows.Add(dt.Rows[i].ItemArray);
    }
    dataGridView1.DataSource = dtPage;
}

2.2.2 自定义分页控件实现分页

如果想要实现更为自由度高的分页功能,可以自定义分页控件,实现更为灵活的分页功能。自定义分页控件需要实现以下几个基本功能:

  • 设置总页数
  • 设置当前页码
  • 设置每页显示的数据条数
  • 触发分页操作并绑定数据

示例代码如下:

public delegate void PageChangedEventHandler(int pageIndex);
public class PagingControl : UserControl
{
    private int _totalPages;
    private int _currentPage;
    private int _pageSize;
    private Button btnFirst;
    private Button btnPrev;
    private TextBox txtPageNum;
    private Button btnNext;
    private Button btnLast;

    public int TotalPages
    {
        get { return _totalPages; }
        set
        {
            _totalPages = value;
            UpdateControlStatus();
        }
    }

    public int CurrentPage
    {
        get { return _currentPage; }
        set
        {
            _currentPage = value;
            txtPageNum.Text = _currentPage.ToString();
            UpdateControlStatus();
        }
    }

    public int PageSize
    {
        get { return _pageSize; }
        set
        {
            _pageSize = value;
            UpdateControlStatus();
        }
    }

    public event PageChangedEventHandler PageChanged;

    protected virtual void OnPageChanged(int pageIndex)
    {
        if (PageChanged != null)
            PageChanged(pageIndex);
        UpdateControlStatus();
    }

    private void UpdateControlStatus()
    {
        bool enableBtnFirst = true;
        bool enableBtnPrev = true;
        bool enableBtnNext = true;
        bool enableBtnLast = true;
        if (CurrentPage == 1)
        {
            enableBtnFirst = false;
            enableBtnPrev = false;
        }
        if (CurrentPage == TotalPages)
        {
            enableBtnNext = false;
            enableBtnLast = false;
        }
        btnFirst.Enabled = enableBtnFirst;
        btnPrev.Enabled = enableBtnPrev;
        btnNext.Enabled = enableBtnNext;
        btnLast.Enabled = enableBtnLast;
    }

    private void btnFirst_Click(object sender, EventArgs e)
    {
        CurrentPage = 1;
        OnPageChanged(CurrentPage);
    }

    private void btnPrev_Click(object sender, EventArgs e)
    {
        CurrentPage--;
        OnPageChanged(CurrentPage);
    }

    private void txtPageNum_TextChanged(object sender, EventArgs e)
    {
        int newPage;
        int.TryParse(txtPageNum.Text, out newPage);
        if (newPage > 0 && newPage <= TotalPages)
        {
            CurrentPage = newPage;
            OnPageChanged(CurrentPage);
        }
        else
        {
            txtPageNum.Text = CurrentPage.ToString();
        }
    }

    private void btnNext_Click(object sender, EventArgs e)
    {
        CurrentPage++;
        OnPageChanged(CurrentPage);
    }

    private void btnLast_Click(object sender, EventArgs e)
    {
        CurrentPage = TotalPages;
        OnPageChanged(CurrentPage);
    }

    // 初始化控件
    public void InitControl()
    {
        btnFirst = new Button();
        btnFirst.Text = "<<";
        btnFirst.Click += btnFirst_Click;

        btnPrev = new Button();
        btnPrev.Text = "<";
        btnPrev.Click += btnPrev_Click;

        txtPageNum = new TextBox();
        txtPageNum.Width = 50;
        txtPageNum.TextChanged += txtPageNum_TextChanged;

        btnNext = new Button();
        btnNext.Text = ">";
        btnNext.Click += btnNext_Click;

        btnLast = new Button();
        btnLast.Text = ">>";
        btnLast.Click += btnLast_Click;

        Controls.Add(btnFirst);
        Controls.Add(btnPrev);
        Controls.Add(txtPageNum);
        Controls.Add(btnNext);
        Controls.Add(btnLast);
    }
}

总结

以上就是关于C# Winform分页功能的实现攻略,我们可以根据自己的需求选择使用DataGridView或自定义分页控件来实现想要的分页功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# Winform 分页功能的实现 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#的加密与解密

    C#的加密与解密 C#提供了多种加密与解密方式,常见的有对称加密、非对称加密和哈希算法。 对称加密 对称加密即使用相同的密钥进行加密和解密。常见的对称加密算法有DES、AES等。 示例代码: using System.Security.Cryptography; using System.Text; public static string Encrypt(…

    C# 2023年6月1日
    00
  • C#实现组合排列的方法

    我们知道,组合和排列是组合数学中的两个基本概念。这两个概念经常会在编程中用到,因此在C#中实现它们是非常必要的。 什么是组合? 组合是从n个元素中取出m个元素(m<=n),不考虑元素的顺序,这样的m元组的个数叫做从n个不同元素中取出m个元素的组合数。 组合数的计算公式为C(n,m) = n!/(m! * (n-m)!)。 什么是排列? 排列是从n个元素…

    C# 2023年6月6日
    00
  • 详解WPF如何在基础控件上显示Loading等待动画

    下面我会详细讲解如何在WPF基础控件上显示Loading等待动画的完整攻略。 使用WPF Toolkit自带的Loading动画 WPF Toolkit是一个由Microsoft约定和支持的开源项目,该项目包含了一些方便的控件和工具。其中就包含了Loading动画的控件。 第一步:引入WPF Toolkit 首先要引入WPF Toolkit,可以通过NuGe…

    C# 2023年6月6日
    00
  • C#实现的JS操作类实例

    C#实现的JS操作类实例是一种将JavaScript的函数和对象绑定到C#代码中的技术。它允许C#开发人员使用JavaScript函数和对象,从而可以轻松地利用JavaScript所提供的功能。以下是一个详细的攻略,帮助您了解如何使用C#实现JS操作类实例。 创建一个C#实现的JS操作类 首先,我们需要创建一个C#实现的JS操作类,以便在C#代码中使用Jav…

    C# 2023年6月7日
    00
  • C#迭代器方法介绍

    下面就是关于C#迭代器方法介绍的完整攻略。 什么是迭代器方法 迭代器是一种C#语言中的一种特殊方法,它允许我们以可枚举的方式迭代访问集合中的元素,而不必浪费时间和内存将整个集合复制到数组中。 如何编写迭代器方法 要编写一个迭代器方法,只需要使用yield关键字,将一个或多个元素作为集合的成员返回。这将构建时序集合,每个调用将返回它的下一个元素。在没有更多元素…

    C# 2023年5月15日
    00
  • C#11新特性预览及使用介绍

    C# 11新特性预览及使用介绍 介绍 C# 11新特性加入了一些新的语言特性,使得C#语言更具表达力和灵活性。在本文中,我们将介绍C# 11的一些新功能并演示如何使用它们。 新特性 1. 本地函数的支持 C# 10已经支持了本地函数的语法,但在C# 11中,我们可以在本地函数中使用“拓展方法”。具体而言,我们可以在本地函数中使用类的拓展方法。 例如,我们需要…

    C# 2023年5月14日
    00
  • WCF的异常处理

    关于WCF的异常处理,以下是一些基本的知识点和攻略: WCF异常处理基本知识 在WCF中,所有异常都由服务契约(contract)抛出,客户端都可以通过异常处理程序处理这些异常。 WCF中异常处理程序可以在服务端和客户端都实现。 服务端和客户端都可以捕获异常并作出相应的响应,比如返回错误信息给客户端或写入设备日志。 WCF中有一些异常是常见的,比如Timeo…

    C# 2023年5月14日
    00
  • 深入探讨C#中的结构struct

    深入探讨C#中的结构struct 在C#中,结构(struct)是一种值类型(value type),不同于引用类型(reference type)。结构可以用来表示较简单的数据结构,比如二维坐标(x,y),RGB颜色等等。 结构的定义 结构可以通过struct关键字来定义。例如定义一个二维的点的结构,代码如下: public struct Point2D …

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部