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_661_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
))

@H_404_2385@筛选以及分组语句.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;

}

}

表名,包括视图

string TableName

{

get

{

return _TableName;

}

set

{

_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()

@H_502_3472@{

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