下面是关于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技术站