C# Winform 分页功能的实现

yizhihongxing

下面是关于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#中,委托是一种类型,它可以封装一个或一组方法,供其他代码调用。简单来说,它就是函数指针的一种类型安全实现。 委托的定义和使用 可以使用 delegate 关键字定义委托,如下所示: public delegate void DelegateType(int param); 上面这段代码中,我们定义了一个名为 De…

    C# 2023年6月7日
    00
  • 在win7中chm打不开的多种解决方法

    当在win7中尝试打开CHM文件时,有时会遇到无法打开的情况。这种情况一般由于系统权限和安全策略等问题所致。下面是几种解决办法: 方法一:修改注册表 打开注册表编辑器(regedit)。 找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp\1.x\ItssRestrictions键值。 如果该键值不存在,则需要手…

    C# 2023年6月7日
    00
  • C#代码实现扑克牌排序的几种方式

    C#代码实现扑克牌排序的几种方式 1. 排序算法简介 排序算法是计算机程序设计中重要的算法之一,其目的是把一组无序的数据按照一定的顺序排列。排序算法在许多领域中都有广泛的应用,如在数据库中对数据进行排序,对数据结构中的元素进行排序等。 目前常用的排序算法有插入排序、冒泡排序、选择排序、快速排序、归并排序等。其中,插入排序、冒泡排序、选择排序是比较基础和简单的…

    C# 2023年6月7日
    00
  • C#连接Oracle数据库字符串(引入DLL)的方式

    C#连接Oracle数据库需要引入Oracle官方提供的 DLL 文件,通过以下步骤可以完成连接Oracle数据库字符串的设置: 第一步:下载 Oracle 操作库 从 Oracle 官网下载 Oracle 操作库,例如:Oracle.DataAccess.dll。 第二步:引入 DLL 在项目中添加引用库,将刚才下载的 Oracle.DataAccess.…

    C# 2023年6月2日
    00
  • C#中Dictionary泛型集合7种常见的用法

    下面是”C#中Dictionary泛型集合7种常见的用法”的完整攻略: 1. 创建Dictionary对象 使用Dictionary之前,首先需要创建Dictionary对象。可以通过以下代码创建: Dictionary<TKey, TValue> dict = new Dictionary<TKey, TValue>(); 其中,T…

    C# 2023年5月31日
    00
  • C#连接mariadb(MYSQL分支)代码示例分享

    下面我将为您详细讲解“C#连接mariadb(MYSQL分支)代码示例分享”的完整攻略。 一、准备工作 在连接 mariadb 前需要先安装 mariadb 的 C# 驱动,如下所示: PM> Install-Package MySql.Data 二、连接 mariadb 数据库 通过以下代码示例,我们可以使用 C# 连接 mariadb 数据库: s…

    C# 2023年6月2日
    00
  • C#基础知识之GetType与typeof的区别小结

    下面为您详细讲解“C#基础知识之GetType与typeof的区别小结”的攻略。 1. GetType方法 GetType方法是C#中的一个对象方法,返回对象的实际类型。它位于System.Object类中,并且可以被所有派生自System.Object的类调用。 1.1 语法格式 public Type GetType(); 1.2 返回值 GetType…

    C# 2023年6月7日
    00
  • Unity Shader实现水波纹效果

    下面是详细讲解“Unity Shader实现水波纹效果”的完整攻略,共分四个步骤: 1. 编写顶点着色器 在顶点着色器中,我们需要定义一个变量来储存水波的振幅,并将其应用到顶点坐标上。以下是实现水波纹效果的基本顶点着色器代码: Shader "Custom/Water" { Properties { _Amplitude ("A…

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