分享一个Winform下的分页控件
前两天有一个简单的C/S项目用到分页,因为是Winform下,没有现成的,自己也懒得写,就找了下,看到了ycmoon的一个控件
http://www.cnblogs.com/ycmoon/archive/2010/01/07/1640689.html
参考后,做了简化,只保留了分页的部分,主要是点击事件的Delegate,未做过多测试,有兴趣的朋友可以下载源码自行修改,如有好的建议,也可以给我反馈。3w@live.cn,效果如下:
控件设计界面:
设计时:
运行时:
附带一个取分页数据的存储过程:
View Code
CreateDataBase Db_TonyPaging
go
use Db_TonyPaging
go
ifexists (select1
from sysobjects
where id =object_id('DepartDemo')
and type ='U')
droptable DepartDemo
go
/*==============================================================*/
/* Table: DepartDemo */
/*==============================================================*/
createtable DepartDemo (
PKID intidentity(1,1),
DName nvarchar(200) null,
DCode nvarchar(500) null,
Manager nvarchar(50) null,
ParentID intnulldefault0,
AddUser nvarchar(50) null,
AddTime datetimenull,
ModUser nvarchar(50) null,
ModTime datetimenull,
CurState smallintnotnulldefault0,
Remark nvarchar(500) null,
F1 intnotnulldefault0,
F2 nvarchar(300) null,
constraint PK_DEPARTDEMO primarykey (PKID)
)
go
truncatetable DepartDemo
go
/***************创建54 条测试数据*********************
****************downmoo 3w@live.cn ***************/
declare@ddatetime
set@d=getdate()
declare@iint
set@i=1
while@i<=54
begin
--插入一条测试数据
insertinto DepartDemo
select'国家统计局房产审计'+Cast(@iasNvarchar(10))+'科','0','胡不归',0,'DemoUser',getdate(),
'','1900-01-01',1,'专业评估全国房价,为老百姓谋福祉',0,''
set@i=@i+1
end
go
--***********分页存储过程用于SQL server2005/2008、2008R2****************************
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CreatePROCEDURE[dbo].[ZJF_CPP_GetPagedRecordFor2005_2008]
(@Tablevarchar(1000), --表名,多表是请使用 tA a inner join tB b On a.AID = b.AID
@TIndexnvarchar(100), --主键,可以带表头 a.AID
@Columnnvarchar(2000) ='*',--读取字段
@Sqlnvarchar(3000) ='',--Where条件
@PageIndexint=1, --开始页码
@PageSizeint=10, --页大小
@Sortnvarchar(200) =''--排序字段
)
AS
DECLARE@strWherevarchar(2000)
declare@strsqlnvarchar(3900)
IF@SqlISNOTNULLANDlen(ltrim(rtrim(@Sql)))>0
BEGIN
SET@strWhere=' WHERE '+@Sql+''
END
ELSE
BEGIN
SET@strWhere=''
END
if (charindex(ltrim(rtrim(@TIndex)),@Sort)=0)
begin
if(@Sort='')
set@Sort=@TIndex+' DESC '
else
set@Sort=@Sort+' , '+@TIndex+' DESC '
end
IF@PageIndex<1
SET@PageIndex=1
if@PageIndex=1--第一页提高性能
begin
set@strsql='select top '+str(@PageSize) +''+@Column+' from '+@Table+''+@strWhere+' ORDER BY '+@Sort
end
else
begin
/**//**//**//*Execute dynamic query*/
DECLARE@START_IDnvarchar(50)
DECLARE@END_IDnvarchar(50)
SET@START_ID=convert(nvarchar(50),(@PageIndex-1) *@PageSize+1)
SET@END_ID=convert(nvarchar(50),@PageIndex*@PageSize)
set@strsql=' SELECT '+@Column+'
FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@Sort+') AS rownum,
'+@Column+'
FROM '+@Table+' WITH(NOLOCK) '+@strWhere+') AS D
WHERE rownum BETWEEN '+@START_ID+' AND '+@END_ID+' ORDER BY '+@Sort
END
EXEC(@strsql)
print@strsql
set@strsql='SELECT Count(1) as TotalRecords FROM '+@Table+' WITH(NOLOCK) '+@strWhere
print@strsql
EXEC(@strsql)
go
use Db_TonyPaging
go
ifexists (select1
from sysobjects
where id =object_id('DepartDemo')
and type ='U')
droptable DepartDemo
go
/*==============================================================*/
/* Table: DepartDemo */
/*==============================================================*/
createtable DepartDemo (
PKID intidentity(1,1),
DName nvarchar(200) null,
DCode nvarchar(500) null,
Manager nvarchar(50) null,
ParentID intnulldefault0,
AddUser nvarchar(50) null,
AddTime datetimenull,
ModUser nvarchar(50) null,
ModTime datetimenull,
CurState smallintnotnulldefault0,
Remark nvarchar(500) null,
F1 intnotnulldefault0,
F2 nvarchar(300) null,
constraint PK_DEPARTDEMO primarykey (PKID)
)
go
truncatetable DepartDemo
go
/***************创建54 条测试数据*********************
****************downmoo 3w@live.cn ***************/
declare@ddatetime
set@d=getdate()
declare@iint
set@i=1
while@i<=54
begin
--插入一条测试数据
insertinto DepartDemo
select'国家统计局房产审计'+Cast(@iasNvarchar(10))+'科','0','胡不归',0,'DemoUser',getdate(),
'','1900-01-01',1,'专业评估全国房价,为老百姓谋福祉',0,''
set@i=@i+1
end
go
--***********分页存储过程用于SQL server2005/2008、2008R2****************************
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CreatePROCEDURE[dbo].[ZJF_CPP_GetPagedRecordFor2005_2008]
(@Tablevarchar(1000), --表名,多表是请使用 tA a inner join tB b On a.AID = b.AID
@TIndexnvarchar(100), --主键,可以带表头 a.AID
@Columnnvarchar(2000) ='*',--读取字段
@Sqlnvarchar(3000) ='',--Where条件
@PageIndexint=1, --开始页码
@PageSizeint=10, --页大小
@Sortnvarchar(200) =''--排序字段
)
AS
DECLARE@strWherevarchar(2000)
declare@strsqlnvarchar(3900)
IF@SqlISNOTNULLANDlen(ltrim(rtrim(@Sql)))>0
BEGIN
SET@strWhere=' WHERE '+@Sql+''
END
ELSE
BEGIN
SET@strWhere=''
END
if (charindex(ltrim(rtrim(@TIndex)),@Sort)=0)
begin
if(@Sort='')
set@Sort=@TIndex+' DESC '
else
set@Sort=@Sort+' , '+@TIndex+' DESC '
end
IF@PageIndex<1
SET@PageIndex=1
if@PageIndex=1--第一页提高性能
begin
set@strsql='select top '+str(@PageSize) +''+@Column+' from '+@Table+''+@strWhere+' ORDER BY '+@Sort
end
else
begin
/**//**//**//*Execute dynamic query*/
DECLARE@START_IDnvarchar(50)
DECLARE@END_IDnvarchar(50)
SET@START_ID=convert(nvarchar(50),(@PageIndex-1) *@PageSize+1)
SET@END_ID=convert(nvarchar(50),@PageIndex*@PageSize)
set@strsql=' SELECT '+@Column+'
FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@Sort+') AS rownum,
'+@Column+'
FROM '+@Table+' WITH(NOLOCK) '+@strWhere+') AS D
WHERE rownum BETWEEN '+@START_ID+' AND '+@END_ID+' ORDER BY '+@Sort
END
EXEC(@strsql)
print@strsql
set@strsql='SELECT Count(1) as TotalRecords FROM '+@Table+' WITH(NOLOCK) '+@strWhere
print@strsql
EXEC(@strsql)
在WinForm项目中,需要设置控件的总记录数RecordCount(由分页存储过程计算得出),和翻页事件winFormPager1_PageIndexChanged。
测试源码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace DemoPager
{
publicpartialclass frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
#region Members
//总记录数
publicint RecordCount =0;
privatestring strConn =@"Data Source=ap2\vegnet;Initial Catalog=Db_TonyPaging;Integrated Security=SSPI;";
//"Server=localhost;database=Db_TonyPaging;uid=sa;pwd=sa;";
privatestring strProcedure ="ZJF_CPP_GetPagedRecordFor2005_2008";
#endregion
#region Methods
///<summary>
/// 绑定第Index页的数据
///</summary>
///<param name="Index"></param>
privatevoid BindDataWithPage(int Index)
{
winFormPager1.PageIndex = Index;
//winFormPager1.PageSize = 10;; ;
dgvList.DataSource = GetData(strConn, strProcedure, Index, winFormPager1.PageSize);
//获取并设置总记录数
winFormPager1.RecordCount = RecordCount;
}
///<summary>
/// 获取数据源
///</summary>
///<param name="conn"></param>
///<param name="strProcedure"></param>
///<param name="pageIndex"></param>
///<param name="pageSize"></param>
///<returns></returns>
private DataTable GetData(string conn, string strProcedure, int pageIndex, int pageSize)
{
using (SqlConnection connection =new SqlConnection(conn))
{
SqlCommand command =new SqlCommand(strProcedure, connection);
command.CommandType = CommandType.StoredProcedure;//采用存储过程
//存储过程参数
command.Parameters.Add("@Table", SqlDbType.NVarChar, 1000).Value ="DepartDemo";
command.Parameters.Add("@TIndex", SqlDbType.NVarChar, 100).Value ="PKID";
command.Parameters.Add("@Column", SqlDbType.NVarChar, 2000).Value ="*";
command.Parameters.Add("@Sql", SqlDbType.NVarChar, 3000).Value =" 1=1 ";
command.Parameters.Add("@PageIndex", SqlDbType.Int, 8).Value = pageIndex.ToString();
command.Parameters.Add("@PageSize", SqlDbType.Int, 8).Value = pageSize.ToString();
command.Parameters.Add("@Sort", SqlDbType.NVarChar, 200).Value =" PKID desc";
//打开连接
if (connection.State != ConnectionState.Open) { connection.Open(); }
try
{
//填充数据
SqlDataAdapter da =new SqlDataAdapter(command);
DataSet ds =new DataSet();
da.Fill(ds);
//获取总记录数
RecordCount = Convert.ToInt32(ds.Tables[1].Rows[0][0]);
//返回数据集
return ds.Tables[0];
}
catch (SqlException err)
{
MessageBox.Show(err.Message);
returnnull; ;
}
finally
{
connection.Close();
}
}
}
#endregion
#region Events
privatevoid frmMain_Load(object sender, EventArgs e)
{
//不自动生成列
dgvList.AutoGenerateColumns =false;
//绑定数据
BindDataWithPage(1);
}
///<summary>
/// 翻页事件
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
privatevoid winFormPager1_PageIndexChanged(object sender, EventArgs e)
{
BindDataWithPage(winFormPager1.PageIndex);
}
#endregion
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace DemoPager
{
publicpartialclass frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
#region Members
//总记录数
publicint RecordCount =0;
privatestring strConn =@"Data Source=ap2\vegnet;Initial Catalog=Db_TonyPaging;Integrated Security=SSPI;";
//"Server=localhost;database=Db_TonyPaging;uid=sa;pwd=sa;";
privatestring strProcedure ="ZJF_CPP_GetPagedRecordFor2005_2008";
#endregion
#region Methods
///<summary>
/// 绑定第Index页的数据
///</summary>
///<param name="Index"></param>
privatevoid BindDataWithPage(int Index)
{
winFormPager1.PageIndex = Index;
//winFormPager1.PageSize = 10;; ;
dgvList.DataSource = GetData(strConn, strProcedure, Index, winFormPager1.PageSize);
//获取并设置总记录数
winFormPager1.RecordCount = RecordCount;
}
///<summary>
/// 获取数据源
///</summary>
///<param name="conn"></param>
///<param name="strProcedure"></param>
///<param name="pageIndex"></param>
///<param name="pageSize"></param>
///<returns></returns>
private DataTable GetData(string conn, string strProcedure, int pageIndex, int pageSize)
{
using (SqlConnection connection =new SqlConnection(conn))
{
SqlCommand command =new SqlCommand(strProcedure, connection);
command.CommandType = CommandType.StoredProcedure;//采用存储过程
//存储过程参数
command.Parameters.Add("@Table", SqlDbType.NVarChar, 1000).Value ="DepartDemo";
command.Parameters.Add("@TIndex", SqlDbType.NVarChar, 100).Value ="PKID";
command.Parameters.Add("@Column", SqlDbType.NVarChar, 2000).Value ="*";
command.Parameters.Add("@Sql", SqlDbType.NVarChar, 3000).Value =" 1=1 ";
command.Parameters.Add("@PageIndex", SqlDbType.Int, 8).Value = pageIndex.ToString();
command.Parameters.Add("@PageSize", SqlDbType.Int, 8).Value = pageSize.ToString();
command.Parameters.Add("@Sort", SqlDbType.NVarChar, 200).Value =" PKID desc";
//打开连接
if (connection.State != ConnectionState.Open) { connection.Open(); }
try
{
//填充数据
SqlDataAdapter da =new SqlDataAdapter(command);
DataSet ds =new DataSet();
da.Fill(ds);
//获取总记录数
RecordCount = Convert.ToInt32(ds.Tables[1].Rows[0][0]);
//返回数据集
return ds.Tables[0];
}
catch (SqlException err)
{
MessageBox.Show(err.Message);
returnnull; ;
}
finally
{
connection.Close();
}
}
}
#endregion
#region Events
privatevoid frmMain_Load(object sender, EventArgs e)
{
//不自动生成列
dgvList.AutoGenerateColumns =false;
//绑定数据
BindDataWithPage(1);
}
///<summary>
/// 翻页事件
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
privatevoid winFormPager1_PageIndexChanged(object sender, EventArgs e)
{
BindDataWithPage(winFormPager1.PageIndex);
}
#endregion
}
}
下载控件源码及演示程序(含SQL)