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;

}

}

///

/// 表字段FieldStr

///

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;

}

}

///

/// 表字段FieldStr

///

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/ 控件下载