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日

相关文章

  • 谈谈如何在ASP.NET Core中实现CORS跨域

    ASP.NET Core 中实现 CORS 跨域攻略 在 ASP.NET Core 中,我们可以使用 CORS(跨域资源共享)来允许跨域请求。本攻略将介绍如何在 ASP.NET Core 中实现 CORS 跨域。 步骤 以下是实现 CORS 跨域的步骤: 安装 Microsoft.AspNetCore.Cors 包。 在项目中安装 Microsoft.Asp…

    C# 2023年5月17日
    00
  • C#实例化和静态类对象调用对比

    下面是针对“C#实例化和静态类对象调用对比”的完整攻略。 一、实例化对象调用方法 在C#中,我们可以创建一个类的实例,从而调用该类的方法或访问该类的属性。实例化对象可以通过new关键字创建,具体代码如下: MyClass obj = new MyClass(); // 创建MyClass类的实例,存储在obj变量中 obj.MyMethod(); // 调用…

    C# 2023年6月1日
    00
  • C#实现漂亮的数字时钟效果

    C#实现漂亮的数字时钟效果 简介 本文将介绍如何使用C#编程语言实现一个漂亮的数字时钟效果。使用C#中的DateTime和Timer类,以及Windows Forms应用程序框架来实现此效果。 实现步骤 第一步:创建Windows Forms应用程序 在Visual Studio中创建一个Windows Forms应用程序。在Visual Studio的菜单…

    C# 2023年6月1日
    00
  • C#以流方式读socket超时设置的实例

    下面我为您详细讲解一下“C#以流方式读socket超时设置的实例”的完整攻略。 步骤一:创建Socket对象 在使用C#以流方式读socket数据时,首先要创建一个Socket对象,用于建立与远程主机的连接。创建Socket对象的方式可以是如下代码: Socket socket = new Socket(AddressFamily.InterNetwork,…

    C# 2023年5月15日
    00
  • c#数据绑定之将datatabel的data添加listView

    将DataTable的数据添加到ListView实际上可以分为两个步骤:第一步是将DataTable的数据转换成ListViewItem的集合,第二步是将ListViewItem的集合添加到ListView。接下来就具体的讲解一下这个过程。 第一步:数据转换 为了将DataTable的数据添加到ListView中,我们需要先将DataTable的数据转换成L…

    C# 2023年6月1日
    00
  • Unity 点击UI与点击屏幕冲突的解决方案

    下面我会详细讲解“Unity 点击UI与点击屏幕冲突的解决方案”的完整攻略。 问题描述 在使用Unity开发UI界面时,常常会遇到这样的问题:当点击UI控件时,同时也会触发点击屏幕的事件,导致产生冲突或者误操作。这个问题需要解决,否则会影响用户的使用体验。 解决方案 在Unity中,我们可以通过添加代码来解决点击UI与点击屏幕冲突的问题。解决方案大致分为以下…

    C# 2023年6月3日
    00
  • 使用C#调用百度地图并实现坐标点的设置以及读取示例

    以下是使用C#调用百度地图并实现坐标点的设置以及读取的完整攻略。 准备工作 首先,我们需要在百度地图开放平台上申请一个API Key,用于调用地图API。在申请API Key时需要选择 “浏览器端”类型。申请成功后,将API Key保存下来备用。 调用百度地图API C#调用百度地图的基本思路是通过网络请求获取到百度地图的返回数据,然后进行解析、处理。具体流…

    C# 2023年5月15日
    00
  • 浅析C#中数组,ArrayList与List对象的区别

    浅析C#中数组,ArrayList与List对象的区别 在 C# 编程语言中,数组,ArrayList 和 List 都是常用的数据结构。虽然在某些场景下它们可以互相替代,但它们之间还是存在一些区别。 数组 数组是一种固定大小的、连续的数据结构,其中可以存储相同类型的元素。在 C# 中,创建数组的方式有两种。一种是使用数组初始化器,将元素的值直接传递给数组。…

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