winform 分页控件,源码下载
http://files.cnblogs.com/nosnowwolf/Pager.rar?控件下载
以前都是从事B/S开发,由于公司有个比较大的C/S项目,在使用DATAGRIDVIEW的时候,显示数据量比较大,所以才用分页模式,也不知道这样是否正确。
想找个C/S下面的分页控件,都没有什么好的,就自己跟B/S下的分页控件,修改成WINFORM下面的。
首先创建一个用户控件名称为pager,在控件中拖入bindingNavigator和bindingSource,修改bindingNavigator,加入必要的一些控件。
效果如下:

代码实现如下:
?

 namespace
?WindowsApp.MyControl

{
 ????///?<summary>
 ?????申明委托
 ????</summary><param?name="e"></param>
 ????<returns></returns>
 ????public?delegate?int?EventPagingHandler(EventPagingArg?e);
 ?????分页控件呈现
 ????</summary>
 ????partial?class?Pager?:?UserControl
 ????{
 ????????public?Pager()
 ????????{
 ????????????InitializeComponent();
 ????????}
 ????????event?EventPagingHandler?EventPaging;
 ????????
 ?????????每页显示记录数
 ????????</summary>
 ????????private?int?_pageSize?=?20;
 ????????int?PageSize
 ????????{
 ????????????get?{?return?_pageSize;?}
 ????????????set
 ????????????{
 ????????????????_pageSize?=?value;
 ????????????????GetPageCount();
 ????????????}
 ????????}

 ????????int?_nMax?=?0;
 ?????????总记录数
 ????????int?NMax
 ????????{
 ????????????get?{?return?_nMax;?}
 ????????????set
 ????????????{
 ????????????????_nMax?=?value;
 ????????????????GetPageCount();
 ????????????}
 ????????}

 ????????int?_pageCount?=?0;
 ?????????页数=总记录数/每页显示记录数
 ????????int?PageCount
 ????????{
 ????????????get?{?return?_pageCount;?}
 ????????????set?{?_pageCount?=?value;?}
 ????????}

 ????????int?_pageCurrent?=?0;
 ????????@H_878_502@?当前页号
 ????????int?PageCurrent
 ????????{
 ????????????get?{?return?_pageCurrent;?}
 ????????????set?{?_pageCurrent?=?value;?}
 ????????}


 ????????void?GetPageCount()
 ????????{
 ????????????if?(this.NMax?>?0)
 ????????????{
 ????????????????this.PageCount?=?Convert.ToInt32(Math.Ceiling(Convert.ToDouble(this.NMax)?/?Convert.ToDouble(this.PageSize)));
 ????????????}
 ????????????else
 ????????????{
 ????????????????this.PageCount?=?0;
 ????????????}
 ????????}

 ?????????翻页控件数据绑定的方法
 ????????void?Bind()
 ????????{
 ????????????this.EventPaging?!=?null)
 ????????????{
 ????????????????this.NMax?=?this.EventPaging(new?EventPagingArg(this.PageCurrent));
 ????????????}

 ????????????this.PageCurrent?>?this.PageCount)
 ????????????{
 ????????????????this.PageCurrent?=?this.PageCount;
 ????????????}
 ????????????this.PageCount?==?1)
 ????????????{
 ????????????????this.PageCurrent?=?1;
 ????????????}
 ????????????lblPageCount.Text?=?this.PageCount.ToString();
 ????????????this.lblMaxPage.Text?=?"共"+this.NMax.ToString()+条记录";
 ????????????this.txtCurrentPage.Text?=?this.PageCurrent.ToString();

 ????????????this.PageCurrent?==?1)
 ????????????{
 ????????????????this.btnPrev.Enabled?=?false;
 ????????????????this.btnFirst.Enabled?=?false;
 ????????????}
 ????????????else
 ????????????{
 ????????????????btnPrev.Enabled?=?true;
 ????????????????btnFirst.Enabled?=?true;
 ????????????}

 ????????????this.PageCurrent?==?this.PageCount)
 ????????????{
 ????????????????this.btnLast.Enabled?=?this.btnNext.Enabled?=?else
 ????????????{
 ????????????????btnLast.Enabled?=?true;
 ????????????????btnNext.Enabled?=?this.NMax?==?0)
 ????????????{
 ????????????????btnNext.Enabled?=?false;
 ????????????????btnLast.Enabled?=?false;
 ????????????????btnFirst.Enabled?=?false;
 ????????????????btnPrev.Enabled?=?false;
 ????????????}
 ????????}

 ????????void?btnFirst_Click(object?sender,?EventArgs?e)
 ????????{
 ????????????PageCurrent?=?1;
 ????????????this.Bind();
 ????????}

 ????????void?btnPrev_Click( ????????{
 ????????????PageCurrent?-=?if?(PageCurrent?<=?0)
 ????????????{
 ????????????????PageCurrent?=?1;
 ????????????}
 ????????????void?btnNext_Click( ????????{
 ????????????this.PageCurrent?+=?if?(PageCurrent?>?PageCount)
 ????????????{
 ????????????????PageCurrent?=?PageCount;
 ????????????}
 ????????????void?btnLast_Click( ????????{
 ????????????PageCurrent?=?PageCount;
 ????????????void?btnGo_Click( ????????{
 ????????????this.txtCurrentPage.Text?!=?null?&&?txtCurrentPage.Text?!=?"")
 ????????????{
 ????????????????if?(Int32.TryParse(txtCurrentPage.Text,?out?_pageCurrent))
 ????????????????{
 ????????????????????this.Bind();
 ????????????????}
 ????????????????else
 ????????????????{
 ????????????????????Common.MessageProcess.ShowError(输入数字格式错误!");
 ????????????????}
 ????????????}
 ????????}

 ????}
 ?????自定义事件数据基类
 ????class?EventPagingArg?:?EventArgs
 ????{
 ????????int?_intPageIndex;
 ????????public?EventPagingArg(int?PageIndex)
 ????????{
 ????????????_intPageIndex?=?PageIndex;
 ????????}
 ????}
 }

?
控件功能基本实现。
如何绑定数据呢?
大数量分页,使用存储过程。
这个存储过程是网络上考的,呵呵。我把它给贴出来,希望原作者别砸我砖头。。。。。
?





ALTER
????
PROCEDURE
?SP_Pagination

/*
 ***************************************************************
 **?千万数量级分页存储过程?**
 ***************************************************************
 参数说明:
 1.Tables?:表名称,视图
 2.PrimaryKey?:主关键字
 3.Sort?:排序语句,不带Order?By?比如:NewsID?Desc,OrderRows?Asc
 4.CurrentPage?:当前页码
 5.PageSize?:分页尺寸
 6.Filter?:过滤语句,不带Where?
 7.Group?:Group语句,不带Group?By
 效果演示:http://www.cn5135.com/_App/Enterprise/QueryResult.aspx
 ***************************************************************/
 (

@Tables
?
varchar
(
2000
),

@PrimaryKey
?
500
),0)">@Sort
?
500
)?
=
?
NULL
,0)">@CurrentPage
?
int
?
=
?
1
,0)">@PageSize
?
10
,0)">@Fields
?
2000
)?
=
?
'
*
'
,0)">@Filter
?
1000
)?
@Group
?
NULL
 )

AS

默认排序*/

IF
?
IS
?
NULL
?
OR
?
@Sort
?
''

SET
?
@PrimaryKey

DECLARE
?
@SortTable
?
1000
)

@SortName
?
@strSortColumn
?
@operator
?
char
(
2
)

@type
?
@prec
?
int

设定排序语句.IF
?
CHARINDEX
(
DESC
@Sort
)
>
0

BEGIN

@strSortColumn
?
REPLACE
(
@Sort
,?
''
)

@operator
?
<=
'

END

ELSE

ASC
@Sort
)?
>=
.
@strSortColumn
)?
>
?
@SortTable
?
SUBSTRING
(
@strSortColumn
,?
0
,0)">@strSortColumn
))

@SortName
?
+
?
LEN
(
@Tables

@strSortColumn

SELECT
?
@type
=
t.name,0)">@prec
=
c.prec

FROM
?sysobjects?o?

JOIN
?syscolumns?c?
on
?o.id
=
c.id

JOIN
?systypes?t?
on
?c.xusertype
=
t.xusertype

WHERE
?o.name?
AND
?c.name?
@SortName

char
@type
)?
@type
?
+
?
(
'
?
CAST
(
AS
?
varchar
)?
)
@strPageSize
?
500
)

@strStartRow
?
@strFilter
?
@strSimpleFilter
?
@strGroup
?
1000
)

默认当前页@CurrentPage
?
<
?
1

1

设置分页参数.@strPageSize
?
500
))

@strStartRow
?
CAST
(((
-
?
1
)
*
@PageSize
?
1
)?
500
))

筛选以及分组语句.IS
?
NOT
?
AND
?
@Filter
?
!=
?
@strFilter
?
?WHERE?
+
?
?
@strSimpleFilter
?
?AND?
@Group
?
@strGroup
?
?GROUP?BY?
''

执行查询语句EXEC
(

 DECLARE?@SortColumn?
 SET?ROWCOUNT?
 SELECT?@SortColumn=
?FROM?
@Tables
?
?ORDER?BY?
 SELECT?
@Fields
?
?@SortColumn?

'
 )




?
使用该存储过陈,得到数据,将数据绑定到数据控件,提供了一个pageData类

 ????
?数据源提供
 ????</summary>
 ????
public
?
class
?PageData
 ????
{
 ????????int?_PageSize?=?10;
 ????????int?_PageIndex?=?1;
 ????????int?_PageCount?=?0;
 ????????int?_TotalCount?=?string?_TableName;//表名
 ????????string?_QueryFieldName?=?*";表字段FieldStrstring?_OrderStr?=?string.Empty;?排序_SortStrstring?_QueryCondition?=?string.Empty;查询的条件?RowFilterstring?_PrimaryKey?=?主键
 ?????????显示页数
 ????????int?PageSize
 ????????{
 ????????????get
 ????????????{
 ????????????????return?_PageSize;

 ????????????}
 ????????????set
 ????????????{
 ????????????????_PageSize?=?value;
 ????????????}
 ????????}
 ?????????当前页
 ????????int?PageIndex
 ????????{
 ????????????get
 ????????????{
 ????????????????return?_PageIndex;
 ????????????}
 ????????????set
 ????????????{
 ????????????????_PageIndex?=?value;
 ????????????}
 ????????}
 ?????????总页数
 ????????int?PageCount
 ????????{
 ????????????get
 ????????????{
 ????????????????return?_PageCount;
 ????????????}
 ????????}
 ????????int?TotalCount
 ????????{
 ????????????get
 ????????????{
 ????????????????return?_TotalCount;
 ????????????}
 ????????}
 ????????@H_690_3012@?表名,包括视图
 ????????string?TableName
 ????????{
 ????????????get
 ????????????{
 ????????????????return?_TableName;
 ????????????}
 ????????????set
@H_301_3071@ ????????????{
 ????????????????_TableName?=?value;
 ????????????}
 ????????}
 ?????????表字段FieldStr
 ????????string?QueryFieldName
 ????????{
 ????????????get
 ????????????{
 ????????????????return?_QueryFieldName;
 ????????????}
 ????????????set
 ????????????{
 ????????????????_QueryFieldName?=?value;
 ????????????}
 ????????}
 ?????????排序字段
 ????????string?OrderStr
 ????????{
 ????????????get
 ????????????{
 ????????????????return?_OrderStr;
 ????????????}
 ????????????set
 ????????????{
 ????????????????_OrderStr?=?value;
 ????????????}
 ????????}
 ?????????查询条件
 ????????string?QueryCondition
 ????????{
 ????????????get
 ????????????{
 ????????????????return?_QueryCondition;
 ????????????}
 ????????????set
 ????????????{
 ????????????????_QueryCondition?=?value;
 ????????????}
 ????????}
 ?????????主键
 ????????string?PrimaryKey
 ????????{
 ????????????get?{
 ????????????????return?_PrimaryKey;
 ????????????}
 ????????????set?{
 ????????????????_PrimaryKey?=?value;
 ????????????}
 ????????}
 ????????public?DataSet?QueryDataTable()
 ????????{
 ????????????sqlParameter[]?parameters?=?{
 ????????????????????new?sqlParameter(@Tables",?sqlDbType.VarChar,?255),
 ????????????????????@PrimaryKey"?,?sqlDbType.VarChar?,????
 ????????????????????@Sort255?),0)">@CurrentPage@PageSize ????????????????????@Fields@Filter1000),0)">@Group1000?)
 ????????????????????};
 ????????????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?=?string.Empty;
 ????????????DataSet?ds?=?DbHelpersql.RunProcedure(SP_Paginationdd");
 ????????????_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;
 ????????}

 ????????int?GetTotalCount()
 ????????{
 ????????????string?strsql?=??select?count(1)?from?"+_TableName;
 ????????????if?(_QueryCondition?!=?string.Empty)
 ????????????{
 ????????????????strsql?+=?where?"?+?_QueryCondition;
 ????????????}
 ????????????return?int.Parse(DbHelpersql.GetSingle(strsql).ToString());
 ????????}
 ????}

?
好了,在页面放个DATAGRIDVIEW 拖入控件pager
?
?

 ??
private
?
void
?ReceiveOrderJLForm_Load(
object
?sender,?EventArgs?e)
 ????????
{
 ????????????this.pager1.PageCurrent?=?this.pager1.Bind();
 ????????}
 ????????
int
?dgvBind()
 ????????
{
 ????????????WindowsApp.MyControl.PageData?pageData?=?new?WindowsApp.MyControl.PageData();
 ????????????pageData.TableName?=?T_ReceiveOrder";
 ????????????pageData.PrimaryKey?=?ReceiveOrderID";
 ????????????pageData.OrderStr?=?ReceiveOrderID?desc";
 ????????????pageData.PageIndex?=?this.pager1.PageCurrent;
 ????????????pageData.PageSize?=?this.pager1.PageSize;
 ????????????pageData.QueryCondition?=?_strsql?+?strWhere.ToString();
 ????????????pageData.QueryFieldName?=?";

 ????????????this.pager1.bindingSource.DataSource?=?pageData.QueryDataTable().Tables[0];
 ????????????this.pager1.bindingNavigator.BindingSource?=?pager1.bindingSource;
 ????????????dgvReceiveOrder.AutoGenerateColumns?=?false;
 ????????????dgvReceiveOrder.DataSource?=?this.pager1.bindingSource;
 ????????????return?pageData.TotalCount;
 ????????}
 ????????
int
?pager1_EventPaging(WindowsApp.MyControl.EventPagingArg?e)
 ????????
{
 ????????????return?dgvBind();
 ????????}

?效果如下
?
 ?
?http://files.cnblogs.com/nosnowwolf/Pager.rar?控件下载
分类:?
WinForm
标签:?
分页控件,?
winfrom,?
datagridview (编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|