1、创建分页控件
右击项目,添加


2、创建分页时所需要的按钮

3、定义一个事件,用于在引发分页时,方便外部 重新获取数据绑定
EventHandler即事件委托,表示用于处理不具有事件数据的事件的方法。 字面上理解就是一个事件处理器,将一个事件与处理事件的方法联系起来的一种 机制 EventHandler委托有两个参数:sender和e,分别表示事件的发送者和传递的事件参数。

4、定义分页中需要用的属性,用来存储分页控件对应的一些值,并在该用户控件的加载事件中设置该属性对应初始值

5、定义一个计算总页数方法GetPageCount()

此处定义的getPageCount()方法,用于在获取到数据总条数后,通过设定的每页条数(PageSize)得到对应数据的总页数
6、定义了一个激活按钮的方法:用于在每次对数据进行重新查询后 ,保证按钮处于激活状态

7、定义一个DrawContal()方法(重载方法),这里给了一个int count的参数,该方法用于在窗体中使用

DrawControl()方法,这里参数为bool 型的,该方法中,实现了对用户控件中的一些显示的进行了值绑定,以及在当传入参数为true时,会对使用了该用户控件的窗体数据进行更新,以及对于用户控件中分页控件进行值绑定的操作,该方法还对分页控件的按钮进行了重新激活,在该方法结尾部分还对当前查询获取后的数据,并对相关的按钮进行了禁用功能(例:数据只有一页时禁用全部按钮,在第一页时禁用下一页、最后一页按钮等等。)


8、添加各个按钮的单击事件


用户控件中的代码就上述这些,接下来将用户控件全部代码进行展示
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.LinkLabel;
namespace AssetManageMent
{
public partial class prosation : UserControl
{
/// <summary>
/// 定义一个事件,用于在引发分页时,方便外部重新获取数据绑定
/// </summary>
public event EventHandler OnPageChanged;
public prosation()
{
InitializeComponent();
}
/// <summary>
/// 当前页码
/// </summary>
public int CurrPage { get; set; }
/// <summary>
/// 当前页条数
/// </summary>
public int PageSize { get; set; }
/// <summary>
/// 总页数
/// </summary>
public int totaPage { get; set; }
/// <summary>
/// 总条数
/// </summary>
public int totaCount { get; set; }
/// <summary>
/// 控件加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void prosation_Load(object sender, EventArgs e)
{
CurrPage = 1;
PageSize = 5;
totaPage = 0;
totaCount = 0;
}
/// <summary>
/// 计算总页数
/// </summary>
/// <returns></returns>
private int GetPageCount()
{
if (PageSize==0)
{
return 0;
}
//定义参数,判断是否需要增加一页
int PageCount = totaCount / PageSize;
if (totaCount % PageSize == 0)
{
PageCount = totaCount / PageSize;
}
else
{
PageCount = totaCount / PageSize + 1;
}
return PageCount;
}
/// <summary>
/// 激活按钮
/// </summary>
private void SetFormCtrEnabled()
{
btnstart.Enabled = true;
btntwo.Enabled = true;
btntree.Enabled = true;
btnfore.Enabled = true;
}
/// <summary>
/// 接收页面传输的数据总行数的值
/// </summary>
/// <param name="count"></param>
public void DrawContal(int count)
{
totaCount = count;
DrawContal(false);
}
/// <summary>
/// 页面控件展示,主要用于调用窗体中的查询方法
/// </summary>
/// <param name="CallEven"></param>
/// <returns></returns>
private void DrawContal(bool CallEven)
{
totaPage=GetPageCount();
lblPageCount.Text = $"共{totaPage}页,总计{totaCount}条";
//得到pageSize对应的索引
int pIndex = this.cboCurrentPage.Items.IndexOf(this.PageSize.ToString());
//分页控件初始化
this.cboCurrentPage.SelectedIndex = pIndex;
//先将之前的选择页数下拉框内容清理,再绑定新的值
this.cboPageIndex.Items.Clear();
//构造可切换页码下拉列表
for (int i = 1; i <= this.totaPage; i++)
{
this.cboPageIndex.Items.Add(i.ToString());
}
//默认选中当前指定页
this.cboPageIndex.Text = this.CurrPage.ToString();
if (CallEven && OnPageChanged != null)
{
//当前分页数字改变时,触发委托事件
OnPageChanged(this, null);
}
SetFormCtrEnabled();
if (totaPage <= 1)//有且仅有一页
{
btnstart.Enabled = false;
btntree.Enabled = false;
btntwo.Enabled = false;
btnfore.Enabled = false;
}
else if (CurrPage == 1)//第一页
{
btnstart.Enabled = false;
btntwo.Enabled = false;
}
else if (CurrPage == totaCount)//最后一页
{
btntree.Enabled = false;
btnfore.Enabled = false;
}
}
/// <summary>
/// 每页条数更改时
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
bool isTextChanged = false;
private void cboCurrentPage_SelectedIndexChanged(object sender, EventArgs e)
{
this.PageSize = Convert.ToInt32(this.cboCurrentPage.SelectedItem);
this.CurrPage = 1;
DrawContal(true);
}
/// <summary>
/// 第几页更改时
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cboPageIndex_SelectedIndexChanged(object sender, EventArgs e)
{
this.CurrPage = Convert.ToInt32(this.cboPageIndex.SelectedItem);
DrawContal(true);
}
/// <summary>
/// 返回首页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnstart_Click(object sender, EventArgs e)
{
this.CurrPage = 1;
DrawContal(true);
}
/// <summary>
/// 上一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btntwo_Click(object sender, EventArgs e)
{
//当点击结果到第一页时,将上一页按钮禁用
if (this.CurrPage > 1)
{
this.CurrPage--;
}
DrawContal(true);
}
/// <summary>
/// 下一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btntree_Click(object sender, EventArgs e)
{
if (CurrPage < totaPage)
{
this.CurrPage++;
}
DrawContal(true);
}
/// <summary>
/// 末尾页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnfore_Click(object sender, EventArgs e)
{
this.CurrPage = totaPage;
DrawContal(true);
}
///// <summary>
///// 页面需要重新绘制时触发事件
///// </summary>
///// <param name="sender"></param>
///// <param name="e"></param>
//private void prosation_Paint(object sender, PaintEventArgs e)
//{
// DrawContal(e);
//}
}
}
上面就是用户控件中的全部代码。
9、在使用用户控件的窗体中定义一个自定义的事件,该事件中调用窗体的数据查询方法。

10、在窗体的查询绑定方法中对用户控件中的控件进行绑定,以及调用对应的方法
prosationl:就是窗体引用用户空间后自定加载的别名,可用于调用用户控件中的属性、方法
分页的简单计算:
int begin = PageSize * (CurrPage - 1) + 1 ;//用于计算分页的初始位置
int end = PageSize * CurrPage;//用于计算分页时的结束问题
分页SQL语句示例:
SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY DeptID) 'row_no',* FROM Deptlnfo) di WHERE di.row_no BETWEEN 1 AND 5
11、在使用用户控件的窗体加载事件上对用户控件的事件进行绑定订阅

至此,就能完成对sql分页控件的封装,在其他窗体上进行使用时,就只需要将用户控件拉过去使用并绑定和相关如上调用即可。
本文介绍了如何在C#中创建一个带分页功能的用户控件,包括添加分页控件、定义事件处理、计算总页数、绑定数据及响应按钮操作。通过事件委托实现外部数据刷新,适用于SQL查询分页场景。
2209





