2023年6月21日发(作者:)
winform 分页控件
以前都是从事B/S开发,由于公司有个比较大的C/S项目,在使用DATAGRIDVIEW的时候,显示数据量比较大,所以才用分页模式,也不知道这样是否正确。
想找个C/S下面的分页控件,都没有什么好的,就自己跟B/S下的分页控件,修改成WINFORM下面的。
首先创建一个用户控件名称为pager,在控件中拖入bindingNavigator和bindingSource,修改bindingNavigator,加入必要的一些控件。
效果如下:
代码实现如下:
namespace rol
{
///
/// 申明委托
///
///
///
public delegate int EventPagingHandler(EventPagingArg e);
///
/// 分页控件呈现
///
public partial class Pager : UserControl
{
public Pager()
{
InitializeComponent();
} public event EventPagingHandler EventPaging;
///
/// 每页显示记录数
///
private int _pageSize = 20;
///
/// 每页显示记录数
///
public int PageSize
{
get { return _pageSize; }
set
{
_pageSize = value;
GetPageCount();
}
}
private int _nMax = 0;
///
/// 总记录数
///
public int NMax
{
get { return _nMax; }
set
{
_nMax = value;
GetPageCount();
}
}
private int _pageCount = 0;
///
/// 页数=总记录数/每页显示记录数
///
public int PageCount
{
get { return _pageCount; }
set { _pageCount = value; }
}
private int _pageCurrent = 0;
///
/// 当前页号
///
public int PageCurrent
{
get { return _pageCurrent; }
set { _pageCurrent = value; }
}
private void GetPageCount()
{
if ( > 0)
{
unt = 32(g(le() / le(ze)));
}
else
{
unt = 0;
} }
///
/// 翻页控件数据绑定的方法
///
public void Bind()
{
if (aging != null)
{
= aging(new EventPagingArg(rrent));
}
if (rrent > unt)
{
rrent = unt;
}
if (unt == 1)
{
rrent = 1;
}
= ng();
= "共"+ng()+"条记录";
= ng();
if (rrent == 1)
{
d = false;
d = false;
}
else
{ d = true;
d = true;
}
if (rrent == unt)
{
d = false;
d = false;
}
else
{
d = true;
d = true;
}
if ( == 0)
{
d = false;
d = false;
d = false;
d = false;
}
}
private void btnFirst_Click(object sender, EventArgs e)
{
PageCurrent = 1;
();
}
private void btnPrev_Click(object sender, EventArgs e)
{ PageCurrent -= 1;
if (PageCurrent <= 0)
{
PageCurrent = 1;
}
();
}
private void btnNext_Click(object sender, EventArgs e)
{
rrent += 1;
if (PageCurrent > PageCount)
{
PageCurrent = PageCount;
}
();
}
private void btnLast_Click(object sender, EventArgs e)
{
PageCurrent = PageCount;
();
}
private void btnGo_Click(object sender, EventArgs e)
{
if ( != null && != "")
{
if (se(, out _pageCurrent))
{ ();
}
else
{
ror("输入数字格式错误!");
}
}
}
}
///
/// 自定义事件数据基类
///
public class EventPagingArg : EventArgs
{
private int _intPageIndex;
public EventPagingArg(int PageIndex)
{
_intPageIndex = PageIndex;
}
}
}
控件功能基本实现。
如何绑定数据呢?
大数量分页,使用存储过程。
这个存储过程是网络上考的,呵呵。我把它给贴出来,希望原作者别砸我砖头。。。。。
ALTER PROCEDURE SP_Pagination
/*
***************************************************************
** 千万数量级分页存储过程 **
***************************************************************
参数说明:
:表名称,视图
yKey :主关键字
:排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
tPage :当前页码
ze :分页尺寸
:过滤语句,不带Where
:Group语句,不带Group By
效果演示:/_App/Enterprise/
***************************************************************/
(
@Tables varchar(2000),
@PrimaryKey varchar(500),
@Sort varchar(500) = NULL,
@CurrentPage int = 1,
@PageSize int = 10,
@Fields varchar(2000) = '*',
@Filter varchar(1000) = NULL,
@Group varchar(1000) = NULL
)
AS
/*默认排序*/
IF @Sort IS NULL OR @Sort = ''
SET @Sort = @PrimaryKey
DECLARE @SortTable varchar(1000)
DECLARE @SortName varchar(1000) DECLARE @strSortColumn varchar(1000)
DECLARE @operator char(2)
DECLARE @type varchar(1000)
DECLARE @prec int
/*设定排序语句.*/
IF CHARINDEX('DESC',@Sort)>0
BEGIN
SET @strSortColumn = REPLACE(@Sort, 'DESC', '')
SET @operator = '<='
END
ELSE
BEGIN
IF CHARINDEX('ASC', @Sort) = 0
SET @strSortColumn = REPLACE(@Sort, 'ASC', '')
SET @operator = '>='
END
IF CHARINDEX('.', @strSortColumn) > 0
BEGIN
SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))
END
ELSE
BEGIN
SET @SortTable = @Tables
SET @SortName = @strSortColumn
END
SELECT @type=, @prec=
FROM sysobjects o
JOIN syscolumns c on =
JOIN systypes t on ype=ype WHERE = @SortTable AND = @SortName
IF CHARINDEX('char', @type) > 0
SET @type = @type + '(' + CAST(@prec AS varchar) + ')'
DECLARE @strPageSize varchar(500)
DECLARE @strStartRow varchar(500)
DECLARE @strFilter varchar(1000)
DECLARE @strSimpleFilter varchar(1000)
DECLARE @strGroup varchar(1000)
/*默认当前页*/
IF @CurrentPage < 1
SET @CurrentPage = 1
/*设置分页参数.*/
SET @strPageSize = CAST(@PageSize AS varchar(500))
SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(500))
/*筛选以及分组语句.*/
IF @Filter IS NOT NULL AND @Filter != ''
BEGIN
SET @strFilter = ' WHERE ' + @Filter + ' '
SET @strSimpleFilter = ' AND ' + @Filter + ' '
END
ELSE
BEGIN
SET @strSimpleFilter = ''
SET @strFilter = ''
END
IF @Group IS NOT NULL AND @Group != ''
SET @strGroup = ' GROUP BY ' + @Group + ' '
ELSE
SET @strGroup = ''
/*执行查询语句*/
EXEC( '
DECLARE @SortColumn ' + @type + '
SET ROWCOUNT ' + @strStartRow + '
SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
SET ROWCOUNT ' + @strPageSize + '
SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
'
)
使用该存储过陈,得到数据,将数据绑定到数据控件,提供了一个pageData类
///
/// 数据源提供
///
public class PageData
{
private int _PageSize = 10;
private int _PageIndex = 1;
private int _PageCount = 0;
private int _TotalCount = 0;
private string _TableName;//表名
private string _QueryFieldName = "*";//表字段FieldStr
private string _OrderStr = ; //排序_SortStr
private string _QueryCondition = ;//查询的条件 RowFilter
private string _PrimaryKey = ;//主键 ///
/// 显示页数
///
public int PageSize
{
get
{
return _PageSize;
}
set
{
_PageSize = value;
}
}
///
/// 当前页
///
public int PageIndex
{
get
{
return _PageIndex;
}
set
{
_PageIndex = value;
}
}
///
/// 总页数
/// public int PageCount
{
get
{
return _PageCount;
}
}
///
/// 总记录数
///
public int TotalCount
{
get
{
return _TotalCount;
}
}
///
/// 表名,包括视图
///
public string TableName
{
get
{
return _TableName;
}
set
{
_TableName = value;
}
}
///
///
public string QueryFieldName
{
get
{
return _QueryFieldName;
}
set
{
_QueryFieldName = value;
}
}
///
/// 排序字段
///
public string OrderStr
{
get
{
return _OrderStr;
}
set
{
_OrderStr = value;
}
}
///
/// 查询条件
///
public string QueryCondition
{ get
{
return _QueryCondition;
}
set
{
_QueryCondition = value;
}
}
///
/// 主键
///
public string PrimaryKey
{
get {
return _PrimaryKey;
}
set {
_PrimaryKey = value;
}
}
public DataSet QueryDataTable()
{
SqlParameter[] parameters = {
new SqlParameter("@Tables", r, 255),
new SqlParameter("@PrimaryKey" , r , 255),
new SqlParameter("@Sort", r , 255 ),
new SqlParameter("@CurrentPage", ),
new SqlParameter("@PageSize", ),
new SqlParameter("@Fields", r, 255),
new SqlParameter("@Filter", r,1000),
new SqlParameter("@Group" ,r , 1000 )
};
parameters[0].Value = _TableName;
parameters[1].Value = _PrimaryKey;
parameters[2].Value = _OrderStr;
parameters[3].Value = PageIndex;
parameters[4].Value = PageSize;
parameters[5].Value =_QueryFieldName;
parameters[6].Value = _QueryCondition;
parameters[7].Value = ;
DataSet ds = cedure("SP_Pagination", parameters, "dd");
_TotalCount = GetTotalCount();
if (_TotalCount == 0)
{
_PageIndex = 0;
_PageCount = 0;
}
else
{
_PageCount = _TotalCount % _PageSize == 0 ? _TotalCount / _PageSize : _TotalCount / _PageSize + 1;
if (_PageIndex > _PageCount)
{
_PageIndex = _PageCount;
parameters[4].Value = _PageSize;
ds = QueryDataTable();
}
}
return ds;
}
public int GetTotalCount()
{
string strSql = " select count(1) from "+_TableName;
if (_QueryCondition != )
{
strSql +=" where " + _QueryCondition;
}
return (gle(strSql).ToString());
}
}
好了,在页面放个DATAGRIDVIEW 拖入控件pager
private void ReceiveOrderJLForm_Load(object sender, EventArgs e)
{
rrent = 1;
();
}
private int dgvBind()
{
ta pageData = new ta();
ame = "T_ReceiveOrder";
yKey = "ReceiveOrderID";
tr = "ReceiveOrderID desc";
dex = rrent;
ze = ze;
ondition = _strSql + ng();
ieldName = "*";
urce = ataTable().Tables[0];
gSource = gSource;
nerateColumns = false;
urce = gSource;
return ount;
}
private int pager1_EventPaging(agingArg e)
{
return dgvBind();
}
效果如下
/nosnowwolf/ 控件下载
2023年6月21日发(作者:)
winform 分页控件
以前都是从事B/S开发,由于公司有个比较大的C/S项目,在使用DATAGRIDVIEW的时候,显示数据量比较大,所以才用分页模式,也不知道这样是否正确。
想找个C/S下面的分页控件,都没有什么好的,就自己跟B/S下的分页控件,修改成WINFORM下面的。
首先创建一个用户控件名称为pager,在控件中拖入bindingNavigator和bindingSource,修改bindingNavigator,加入必要的一些控件。
效果如下:
代码实现如下:
namespace rol
{
///
/// 申明委托
///
///
///
public delegate int EventPagingHandler(EventPagingArg e);
///
/// 分页控件呈现
///
public partial class Pager : UserControl
{
public Pager()
{
InitializeComponent();
} public event EventPagingHandler EventPaging;
///
/// 每页显示记录数
///
private int _pageSize = 20;
///
/// 每页显示记录数
///
public int PageSize
{
get { return _pageSize; }
set
{
_pageSize = value;
GetPageCount();
}
}
private int _nMax = 0;
///
/// 总记录数
///
public int NMax
{
get { return _nMax; }
set
{
_nMax = value;
GetPageCount();
}
}
private int _pageCount = 0;
///
/// 页数=总记录数/每页显示记录数
///
public int PageCount
{
get { return _pageCount; }
set { _pageCount = value; }
}
private int _pageCurrent = 0;
///
/// 当前页号
///
public int PageCurrent
{
get { return _pageCurrent; }
set { _pageCurrent = value; }
}
private void GetPageCount()
{
if ( > 0)
{
unt = 32(g(le() / le(ze)));
}
else
{
unt = 0;
} }
///
/// 翻页控件数据绑定的方法
///
public void Bind()
{
if (aging != null)
{
= aging(new EventPagingArg(rrent));
}
if (rrent > unt)
{
rrent = unt;
}
if (unt == 1)
{
rrent = 1;
}
= ng();
= "共"+ng()+"条记录";
= ng();
if (rrent == 1)
{
d = false;
d = false;
}
else
{ d = true;
d = true;
}
if (rrent == unt)
{
d = false;
d = false;
}
else
{
d = true;
d = true;
}
if ( == 0)
{
d = false;
d = false;
d = false;
d = false;
}
}
private void btnFirst_Click(object sender, EventArgs e)
{
PageCurrent = 1;
();
}
private void btnPrev_Click(object sender, EventArgs e)
{ PageCurrent -= 1;
if (PageCurrent <= 0)
{
PageCurrent = 1;
}
();
}
private void btnNext_Click(object sender, EventArgs e)
{
rrent += 1;
if (PageCurrent > PageCount)
{
PageCurrent = PageCount;
}
();
}
private void btnLast_Click(object sender, EventArgs e)
{
PageCurrent = PageCount;
();
}
private void btnGo_Click(object sender, EventArgs e)
{
if ( != null && != "")
{
if (se(, out _pageCurrent))
{ ();
}
else
{
ror("输入数字格式错误!");
}
}
}
}
///
/// 自定义事件数据基类
///
public class EventPagingArg : EventArgs
{
private int _intPageIndex;
public EventPagingArg(int PageIndex)
{
_intPageIndex = PageIndex;
}
}
}
控件功能基本实现。
如何绑定数据呢?
大数量分页,使用存储过程。
这个存储过程是网络上考的,呵呵。我把它给贴出来,希望原作者别砸我砖头。。。。。
ALTER PROCEDURE SP_Pagination
/*
***************************************************************
** 千万数量级分页存储过程 **
***************************************************************
参数说明:
:表名称,视图
yKey :主关键字
:排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
tPage :当前页码
ze :分页尺寸
:过滤语句,不带Where
:Group语句,不带Group By
效果演示:/_App/Enterprise/
***************************************************************/
(
@Tables varchar(2000),
@PrimaryKey varchar(500),
@Sort varchar(500) = NULL,
@CurrentPage int = 1,
@PageSize int = 10,
@Fields varchar(2000) = '*',
@Filter varchar(1000) = NULL,
@Group varchar(1000) = NULL
)
AS
/*默认排序*/
IF @Sort IS NULL OR @Sort = ''
SET @Sort = @PrimaryKey
DECLARE @SortTable varchar(1000)
DECLARE @SortName varchar(1000) DECLARE @strSortColumn varchar(1000)
DECLARE @operator char(2)
DECLARE @type varchar(1000)
DECLARE @prec int
/*设定排序语句.*/
IF CHARINDEX('DESC',@Sort)>0
BEGIN
SET @strSortColumn = REPLACE(@Sort, 'DESC', '')
SET @operator = '<='
END
ELSE
BEGIN
IF CHARINDEX('ASC', @Sort) = 0
SET @strSortColumn = REPLACE(@Sort, 'ASC', '')
SET @operator = '>='
END
IF CHARINDEX('.', @strSortColumn) > 0
BEGIN
SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))
END
ELSE
BEGIN
SET @SortTable = @Tables
SET @SortName = @strSortColumn
END
SELECT @type=, @prec=
FROM sysobjects o
JOIN syscolumns c on =
JOIN systypes t on ype=ype WHERE = @SortTable AND = @SortName
IF CHARINDEX('char', @type) > 0
SET @type = @type + '(' + CAST(@prec AS varchar) + ')'
DECLARE @strPageSize varchar(500)
DECLARE @strStartRow varchar(500)
DECLARE @strFilter varchar(1000)
DECLARE @strSimpleFilter varchar(1000)
DECLARE @strGroup varchar(1000)
/*默认当前页*/
IF @CurrentPage < 1
SET @CurrentPage = 1
/*设置分页参数.*/
SET @strPageSize = CAST(@PageSize AS varchar(500))
SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(500))
/*筛选以及分组语句.*/
IF @Filter IS NOT NULL AND @Filter != ''
BEGIN
SET @strFilter = ' WHERE ' + @Filter + ' '
SET @strSimpleFilter = ' AND ' + @Filter + ' '
END
ELSE
BEGIN
SET @strSimpleFilter = ''
SET @strFilter = ''
END
IF @Group IS NOT NULL AND @Group != ''
SET @strGroup = ' GROUP BY ' + @Group + ' '
ELSE
SET @strGroup = ''
/*执行查询语句*/
EXEC( '
DECLARE @SortColumn ' + @type + '
SET ROWCOUNT ' + @strStartRow + '
SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
SET ROWCOUNT ' + @strPageSize + '
SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
'
)
使用该存储过陈,得到数据,将数据绑定到数据控件,提供了一个pageData类
///
/// 数据源提供
///
public class PageData
{
private int _PageSize = 10;
private int _PageIndex = 1;
private int _PageCount = 0;
private int _TotalCount = 0;
private string _TableName;//表名
private string _QueryFieldName = "*";//表字段FieldStr
private string _OrderStr = ; //排序_SortStr
private string _QueryCondition = ;//查询的条件 RowFilter
private string _PrimaryKey = ;//主键 ///
/// 显示页数
///
public int PageSize
{
get
{
return _PageSize;
}
set
{
_PageSize = value;
}
}
///
/// 当前页
///
public int PageIndex
{
get
{
return _PageIndex;
}
set
{
_PageIndex = value;
}
}
///
/// 总页数
/// public int PageCount
{
get
{
return _PageCount;
}
}
///
/// 总记录数
///
public int TotalCount
{
get
{
return _TotalCount;
}
}
///
/// 表名,包括视图
///
public string TableName
{
get
{
return _TableName;
}
set
{
_TableName = value;
}
}
///
///
public string QueryFieldName
{
get
{
return _QueryFieldName;
}
set
{
_QueryFieldName = value;
}
}
///
/// 排序字段
///
public string OrderStr
{
get
{
return _OrderStr;
}
set
{
_OrderStr = value;
}
}
///
/// 查询条件
///
public string QueryCondition
{ get
{
return _QueryCondition;
}
set
{
_QueryCondition = value;
}
}
///
/// 主键
///
public string PrimaryKey
{
get {
return _PrimaryKey;
}
set {
_PrimaryKey = value;
}
}
public DataSet QueryDataTable()
{
SqlParameter[] parameters = {
new SqlParameter("@Tables", r, 255),
new SqlParameter("@PrimaryKey" , r , 255),
new SqlParameter("@Sort", r , 255 ),
new SqlParameter("@CurrentPage", ),
new SqlParameter("@PageSize", ),
new SqlParameter("@Fields", r, 255),
new SqlParameter("@Filter", r,1000),
new SqlParameter("@Group" ,r , 1000 )
};
parameters[0].Value = _TableName;
parameters[1].Value = _PrimaryKey;
parameters[2].Value = _OrderStr;
parameters[3].Value = PageIndex;
parameters[4].Value = PageSize;
parameters[5].Value =_QueryFieldName;
parameters[6].Value = _QueryCondition;
parameters[7].Value = ;
DataSet ds = cedure("SP_Pagination", parameters, "dd");
_TotalCount = GetTotalCount();
if (_TotalCount == 0)
{
_PageIndex = 0;
_PageCount = 0;
}
else
{
_PageCount = _TotalCount % _PageSize == 0 ? _TotalCount / _PageSize : _TotalCount / _PageSize + 1;
if (_PageIndex > _PageCount)
{
_PageIndex = _PageCount;
parameters[4].Value = _PageSize;
ds = QueryDataTable();
}
}
return ds;
}
public int GetTotalCount()
{
string strSql = " select count(1) from "+_TableName;
if (_QueryCondition != )
{
strSql +=" where " + _QueryCondition;
}
return (gle(strSql).ToString());
}
}
好了,在页面放个DATAGRIDVIEW 拖入控件pager
private void ReceiveOrderJLForm_Load(object sender, EventArgs e)
{
rrent = 1;
();
}
private int dgvBind()
{
ta pageData = new ta();
ame = "T_ReceiveOrder";
yKey = "ReceiveOrderID";
tr = "ReceiveOrderID desc";
dex = rrent;
ze = ze;
ondition = _strSql + ng();
ieldName = "*";
urce = ataTable().Tables[0];
gSource = gSource;
nerateColumns = false;
urce = gSource;
return ount;
}
private int pager1_EventPaging(agingArg e)
{
return dgvBind();
}
效果如下
/nosnowwolf/ 控件下载
发布评论