`

再上数据分页控件(不用存储过程)

 
阅读更多

再上数据分页控件(不用存储过程)

发布日期:20110404日 星期一 作者:EricHu

本篇主要内容如下:

· 概述

· 本分页控件原理。

· 分页控件代码。

· 分页控件使用实例。

概述

在前几篇:我介绍了原创企业级控件库之大数据据量分页控件,这个控件主要是通过存储过程进行数据分页,得到了大家的支持,也给出了许多宝贵的建议,在这儿先感谢各位。同时也让我更有信心进行以后的文章(企业级控件库系列)。

分页对于每个项目来说都有它存在的意义,想起在以前刚刚刚软件开发时,由于刚刚毕业,理论知识雄厚,但实际工作经验欠缺,记得几年前做开发时,数据量很大,要用分页,一开始真不知道如何是好,方法到知道,但速度与稳定性却没有经验。在这儿,我只是起到一个抛砖引玉的作用,以便引起我们在实际工作中要多思考,对同一件事多想几种解决方式,只有这样才能不断提高,同时要学会总结。

这篇我将给大家介绍:不用存储过程,直接用代码来实现数据分页,欢迎大家拍砖,觉得不错的可以推荐下。同时,你要用什么好的想法,也可以与我交流,谢谢。

本分页控件原理

分页的方法很多,有用存储过程的,有不用存储过程的,还有在C#中用DataGridView的虚拟模式的,目的只有一个,对大数据量进行处理,让用户体验得到提高,软件速度得到提升。本分页控件主要是用了下面的SQL语句,我相信你能看懂的,存储过程分页也是用类似的SQL代码:

1/*TableName:表名如:tbTestData
2SqlWhereStatement :SqlWhere表达式如:where表达式为空
3PrimaryKey :主键如:UniqueID
4PageSize :分页大小如:50
5pageIndex:当前页如:8
6OrderField :排序字段如:InsetDataTime
7*/
8
9SELECTTOP50*FROMtbTestData
10WHEREUniqueIDNOTIN
11(
12SELECTTOP(50*8)UniqueIDFROMtbTestDataORDERBYInsetDataTimeDESC
13)
14ORDERBYInsetDataTimeDESC

原理就这么简单。

分页控件代码

(一)、实例数据库代码

创建实例数据库。

CREATETABLE[tbTestData](
[UniqueID][bigint]NOTNULL,
[CompanyName][varchar](200)NULL,
[CompanyCode][varchar](50)NULL,
[Address][varchar](500)NULL,
[Owner][varchar](100)NULL,
[Memo][varchar](2000)NULL,
[InsetDataTime][datetime]NULL,
CONSTRAINT[PK_tbTestData]PRIMARYKEYCLUSTERED
(
[UniqueID]ASC
)
WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY]
)
ON[PRIMARY]

GO

ALTERTABLE[dbo].[tbTestData]ADDCONSTRAINT[DF_tbTestData_InsetDataTime]DEFAULT(getdate())FOR[InsetDataTime]
GO

--生成实例数据
declare@intRowNumberint;
select@intRowNumber=1;
while@intRowNumber<1000000
begin

insertintotbTestData(UniqueID,CompanyName,CompanyCode,Address,Owner,Memo)
values(@intRowNumber,'CompanyName'+cast(@intRowNumberasvarchar(2000)),
'CompanyCode'+cast(@intRowNumberasvarchar(2000)),'Address'+cast(@intRowNumberasvarchar(2000)),
'Owner'+cast(@intRowNumberasvarchar(2000)),'Memo'+cast(@intRowNumberasvarchar(2000)));
select@intRowNumber=@intRowNumber+1
end

(二)、分页控件代码。

namespaceDotNet.Controls
{
///<summary>
///分页控件(使用代码实现,不用存储过程)
///UcPageControlByCode
///修改纪录
///
///2010-01-06胡勇修改转到某页由原来的KeyPress方法改为KeyDown,让用户按回车键确认转页,以防止连续绑定两次。
///2011-01-06胡勇增加对分页控件的初始化代码:publicDataTableInitializePageControl()。
///2011-01-05胡勇创建分页控件
///2011-04-02胡勇优化代码、减少不必要的私有变量,去掉多余的代码
///
///<author>
///<name>胡勇</name>
///<QQ>80368704</QQ>
///<Email>80368704@qq.com</Email>
///</author>
///</summary>
[ToolboxItem(true)]
[DefaultEvent(
"OnEventPageClicked")]
[ToolboxBitmap(
typeof(UcPageControlByCode),"Images.UcPageControlByCodeIcon.png")]
[Description(
"分页控件(使用代码实现,不用存储过程)")]
publicpartialclassUcPageControlByCode:UserControl
{
#region私有变量
intrecordCount=0;//记录数
intpageCount=0;//总页数
intpageIndex=0;//当前页
#endregion

#region自定义事件
///<summary>
///单击分页按钮(第一页、上一页、下一页、最后页、跳页)时发生
///</summary>
[Category("UcPageControlByCode"),Description("单击分页按钮时发生")]
publiceventEventHandlerOnEventPageClicked;
#endregion

#region自定义属性
privateint_pageSize=50;//分页大小
privatestring_sqlWhereStatement=string.Empty;//MsSqlWhere语句
privatestring_sqlConnString=string.Empty;//MsSql数据库连接字符串
privatestring_tableName=string.Empty;//表名
privatestring_orderField=string.Empty;//数据表的排序字段
privatestring_primaryKey=string.Empty;//数据表的主键
privatestring_queryFieldList="*";//字段列表(默认为:*)
privateDataTable_pageTable=newDataTable();

///<summary>
///返回当前页码
///</summary>
publicintPageIndex
{
get
{
returnpageIndex+1;
}
}

///<summary>
///得到或设置分页大小(默认为:50)
///</summary>
[Browsable(true),Category("UcPageControlByCode"),Description("得到或设置分页大小(默认为:50)")]
publicintPageSize
{
get
{
return_pageSize;
}
set
{
_pageSize
=value;
}
}

///<summary>
///SQL语句的Where表达式
///</summary>
[Browsable(false),Category("UcPageControlByCode"),Description("得到或设置SQL语句的Where表达式")]
publicstringSqlWhereStatement
{
get
{
return_sqlWhereStatement;
}
set
{
_sqlWhereStatement
=value;
}
}

///<summary>
///得到或设置SqlServer的连接字符串
///</summary>
[Browsable(false),Category("UcPageControlByCode"),Description("得到或设置SqlServer的连接字符串")]
publicstringSqlConnString
{
get
{
return_sqlConnString;
}
set
{
_sqlConnString
=value;
}
}

///<summary>
///得到用户单击分页按钮后返回的DataTable
///</summary>
[Browsable(false),Category("UcPageControlByCode"),Description("得到用户单击分页按钮后返回的DataTable")]
publicDataTablePageTable
{
get
{
return_pageTable;
}
}

///<summary>
///设置或得到与分页控件绑定的表名或视图名
///</summary>
[Browsable(true),Category("UcPageControlByCode"),Description("设置或得到与分页控件绑定的表名或视图名")]
publicstringTableName
{
get
{
return_tableName;
}
set
{
_tableName
=value;
}
}

///<summary>
///设置或得到分页控件排序字段
///</summary>
[Browsable(true),Category("UcPageControlByCode"),Description("设置或得到分页控件排序字段")]
publicstringOrderField
{
get
{
return_orderField;
}
set
{
_orderField
=value;
}
}

///<summary>
///设置或得到分页控件绑定数据表的主键
///</summary>
[Browsable(true),Category("UcPageControlByCode"),Description("设置或得到分页控件绑定数据表的主键")]
publicstringPrimaryKey
{
get
{
return_primaryKey;
}
set
{
_primaryKey
=value;
}
}

///<summary>
///设置或得到分页控件绑定的字段列表(默认为:*)
///</summary>
[Browsable(true),Category("UcPageControlByCode"),Description("设置或得到分页控件绑定的字段列表(默认为:*)")]
publicstringQueryFieldList
{
get
{
return_queryFieldList;
}
set
{
_queryFieldList
=value;
}
}
#endregion

#region构造函数
///<summary>
///分页控件(使用代码实现,不用存储过程)
///</summary>
publicUcPageControlByCode()
{
InitializeComponent();
}
#endregion

#region分页实现相关代码

#regionvoidSetUcPageControlPars(stringconnStr,stringwhereStatement,stringtbName,stringorderField,stringprimaryKeyName,stringfieldList):给UcPageControlByCode控件传递必需参数
///<summary>
///给UcPageControlByCode控件传递必需参数
///</summary>
///<paramname="connStr">连接字符串</param>
///<paramname="whereStatement">MsSqlWhere语句</param>
///<paramname="tbName">数据表名或视力名</param>
///<paramname="orderField">排序字段</param>
///<paramname="primaryKeyName">主键值</param>
///<paramname="fieldList">字段列表(默认为:*)</param>
publicvoidSetUcPageControlPars(stringconnStr,stringwhereStatement,stringtbName
,
stringorderField,stringprimaryKeyName,stringfieldList)
{
if(string.IsNullOrEmpty(connStr.Trim()))
{
DialogHelper.ShowErrorMsg(
"温馨提示:/n无可用的数据库连接!");
return;
}
else
{
this.SqlConnString=connStr;
}
this.SqlWhereStatement=whereStatement;
this.TableName=tbName;
this.OrderField=orderField;
this.PrimaryKey=primaryKeyName;
if(!string.IsNullOrEmpty(fieldList.Trim()))
{
this.QueryFieldList=fieldList;
}
}
#endregion

#regionDataTableInitializePageControl():初始化UcPageControlByCode
///<summary>
///绑定UcPageControlByCode(并返回包含当前页的DataTable)
///</summary>
///<returns>DataTable</returns>
publicDataTableBindPageControl()
{
recordCount
=GetTotalRecordCount();//获取总记录数
pageCount=recordCount/PageSize-ModPage();//保存总页数(减去ModPage()函数防止SQL语句执行时溢出查询范围,可以用存储过程分页算法来理解这句)
pageIndex=0;//保存一个为0的页面索引值到pageIndex
lblPageCount.Text=(recordCount/PageSize+OverPage()).ToString();//显示lblpageCount、lblrecCount的状态
lblRecCount.Text=recordCount.ToString();

if(recordCount<=PageSize)
{
txtGoToPage.Enabled
=false;
}
else
{
txtGoToPage.Enabled
=true;
}

returnTDataBind();
}
#endregion

#region余页计算与总记录数
///<summary>
///计算余页
///</summary>
///<returns></returns>
privateintOverPage()
{
intreturnValue=0;

if(recordCount%PageSize!=0)
{
returnValue
=1;
}

returnreturnValue;
}

///<summary>
///计算余页,防止SQL语句执行时溢出查询范围
///</summary>
///<returns></returns>
privateintModPage()
{
intreturnValue=0;

if(recordCount%PageSize==0&&recordCount!=0)
{
returnValue
=1;
}

returnreturnValue;
}

///<summary>
///计算总记录数
///</summary>
///<returns>记录总数</returns>
privateintGetTotalRecordCount()
{
intreturnValue=0;
stringsqlStatement="selectcount(1)asrowsCountfrom"+TableName;

if(SqlWhereStatement.Trim().Length>0)
{
sqlStatement
="selectcount(1)asrowsCountfrom"+TableName+"where"+SqlWhereStatement;
}

SqlDataReaderdr
=null;
try
{
dr
=DbHelperSQL.ExecuteReader(sqlStatement,SqlConnString);
if(dr.Read())
{
returnValue
=Int32.Parse(dr["rowsCount"].ToString());
}

}
catch(Exceptionex)
{
DialogHelper.ShowErrorMsg(ex.Message);
}
finally
{
dr.Close();
dr.Dispose();
}

returnreturnValue;
}
#endregion

#regionDataTableTDataBind():数据绑定
privateDataTableTDataBind()
{
StringBuildersbSqlStatement
=newStringBuilder();
boolisForward=pageIndex+1>1;
boolisBackward=(pageIndex!=pageCount);
btnFirstPage.Enabled
=isForward;
btnPrevPage.Enabled
=isForward;
btnNextPage.Enabled
=isBackward;
btnLastPage.Enabled
=isBackward;

if(string.IsNullOrEmpty(SqlWhereStatement.Trim()))
{
sbSqlStatement.Append(
"SELECTTOP"+PageSize+""+QueryFieldList+"FROM"+TableName+"WHERE"+PrimaryKey+"NOTIN(SELECTTOP");
sbSqlStatement.Append(PageSize
*pageIndex+""+PrimaryKey+"FROM"+TableName);
sbSqlStatement.Append(
"ORDERBY"+OrderField+"DESC)ORDERBY"+OrderField+"DESC");
}
else
{
sbSqlStatement.Append(
"SELECTTOP"+PageSize+""+QueryFieldList+"FROM"+TableName+"WHERE"+SqlWhereStatement+"AND"+PrimaryKey+"NOTIN(SELECTTOP");
sbSqlStatement.Append(PageSize
*pageIndex+""+PrimaryKey+"FROM"+TableName+"WHERE"+SqlWhereStatement+"ORDERBY"+OrderField+"DESC)ORDERBY"+OrderField+"DESC");
}

_pageTable
=DbHelperSQL.Query(sbSqlStatement.ToString(),SqlConnString).Tables[0];
lblCurrentPage.Text
=(pageIndex+1).ToString();
txtGoToPage.Text
=(pageIndex+1).ToString();
return_pageTable;
}
#endregion

#region按钮事件代码
privatevoidbtnFirstPage_Click(objectsender,EventArgse)
{
pageIndex
=0;
_pageTable
=TDataBind();

if(OnEventPageClicked!=null)
{
OnEventPageClicked(
this,null);
}
}

privatevoidbtnPrevPage_Click(objectsender,EventArgse)
{
pageIndex
--;
_pageTable
=TDataBind();

if(OnEventPageClicked!=null)
{
OnEventPageClicked(
this,null);
}
}

privatevoidbtnNextPage_Click(objectsender,EventArgse)
{
pageIndex
++;
_pageTable
=TDataBind();

if(OnEventPageClicked!=null)
{
OnEventPageClicked(
this,null);
}
}

privatevoidbtnLastPage_Click(objectsender,EventArgse)
{
pageIndex
=pageCount;
_pageTable
=TDataBind();

if(OnEventPageClicked!=null)
{
OnEventPageClicked(
this,null);
}
}

privatevoidtxtGoToPage_KeyDown(objectsender,KeyEventArgse)
{
if(e.KeyCode==Keys.Enter)
{
try
{
if(Int32.Parse(txtGoToPage.Text)>(recordCount/PageSize+OverPage())||Int32.Parse(txtGoToPage.Text)<=0)
{
DialogHelper.ShowWarningMsg(
"页码范围越界!");
txtGoToPage.Clear();
txtGoToPage.Focus();
}
else
{
pageIndex
=Int32.Parse(txtGoToPage.Text.ToString())-1;
_pageTable
=TDataBind();

if(OnEventPageClicked!=null)
{
OnEventPageClicked(
this,null);
}
}
}
catch(Exceptionex)//捕获由用户输入不正确数据类型时造成的异常
{
DialogHelper.ShowWarningMsg(ex.Message);
txtGoToPage.Clear();
txtGoToPage.Focus();
}
}
}
#endregion

#endregion
}
}

分页控件使用实例

客户端使用代码如下:

View Code
1usingSystem;
2usingSystem.Collections.Generic;
3usingSystem.ComponentModel;
4usingSystem.Data;
5usingSystem.Drawing;
6usingSystem.Configuration;
7usingDotNet.Controls;
8usingSystem.Text;
9usingSystem.Windows.Forms;
10usingDotNet.Common;
11usingDotNet.WinForm.Utilities;
12
13namespaceDotNet.WinForm.Example
14{
15publicpartialclassFrmUcPageControlByCodeTest:Form
16{
17publicFrmUcPageControlByCodeTest()
18{
19InitializeComponent();
20}
21
22privatevoidFrmUcPageControlByCodeTest_Shown(objectsender,EventArgse)
23{
24//初始化方法一
25//ucPageControlByCode.SqlConnString=ConfigurationSettings.AppSettings["DbConnection"];
26//ucPageControlByCode.SqlWhereStatement="1=1";
27//ucPageControlByCode.TableName="tbTestData";
28//ucPageControlByCode.OrderField="UniqueID";
29//ucPageControlByCode.PrimaryKey="UniqueID";
30//ucPageControlByCode.QueryFieldList="*";
31
32//初始化方法二
33ucPageControlByCode.SetUcPageControlPars(ConfigurationSettings.AppSettings["DbConnection"],"1=1","tbTestData",
34"UniqueID","UniqueID","*");
35DataTabledtTest=newDataTable();
36dtTest=ucPageControlByCode.BindPageControl();
37ucDataGridView.DataSource=dtTest;
38
39//绑定查询项
40Dictionary<string,string>dicListQueryItems=newDictionary<string,string>();
41foreach(DataColumndcindtTest.Columns)
42{
43dicListQueryItems.Add(dc.ColumnName,dc.DataType.ToString());
44}
45ucCombinQuery1.SetQueryItems(dicListQueryItems);
46}
47
48privatevoiducDataGridView_DataBindingComplete(objectsender,DataGridViewBindingCompleteEventArgse)
49{
50gbMain.Text="当前共:"+ucDataGridView.Rows.Count.ToString()+"条数据。";
51}
52
53privatevoiducPageControlByCode_OnEventPageClicked(objectsender,EventArgse)
54{
55ucDataGridView.DataSource=null;
56ucDataGridView.DataSource=ucPageControlByCode.PageTable;
57}
58
59privatevoiducCombinQuery1_OnQueryClicked(objectsender,EventArgse)
60{
61try
62{
63Splasher.Show(typeof(FrmSplash));
64Splasher.Status="正在查找数据,请稍等...";
65System.Threading.Thread.Sleep(450);
66ucDataGridView.DataSource=null;
67ucPageControlByCode.SqlWhereStatement=ucCombinQuery1.QueryExpression;//指定查询表达式
68ucDataGridView.DataSource=ucPageControlByCode.BindPageControl();//绑定DataGridView
69}
70catch(Exceptionex)
71{
72ucPageControlByCode.SqlWhereStatement="1<>1";
73ucDataGridView.DataSource=ucPageControlByCode.BindPageControl();//绑定DataGridView
74Splasher.Status=ex.Message;
75System.Threading.Thread.Sleep(1000);
76}
77finally
78{
79System.Threading.Thread.Sleep(100);
80Splasher.Status="查找完毕...";
81Splasher.Close();
82}
83}
84}
85}

最后的效果如下:

© 2011 EricHu

原创作品,转贴请注明作者和出处,留此信息。

------------------------------------------------

cnBlobs:http://www.cnblogs.com/huyong/
CSDNhttp://blog.csdn.net/chinahuyong

作者:EricHuDBC/SB/SWebServiceWCFPM等)
出处:http://www.cnblogs.com/huyong/

Q Q80368704 E-Mail: 80368704@qq.com
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。
更多文章请看[置顶]索引贴——(不断更新中)

分享到:
评论

相关推荐

    自定义用户分页控件_分页程存过程

    一个自定义用户分页控件, 数据绑定利用了委托,将外部数据绑定函数赋给了委托变量,从而实现了分页控件与DataGridView的联动,采用了存储过程分页。 附有数据库文件,附加即可。

    WinForm界面开发之“分页控件”

    就我而言,我希望控件能够尽可能的多一些功能,耦合性低一些,例如我不想是基于存储过程的,因为我很多程序需要使用Access作为数据库,一般来说,我还希望有导出Excel数据的功能,还有打印预览功能,由于我的数据源...

    Repeater 分页控件

    一般开发绑定数据的时候...其实这个分页控件非常简单,分页控件只是根据记录数和当前页数等设置而输出一个分页导航条而已,并没有参与真正的分页,具体如何从数据库读取分页数据,还需自己编写存储过程或者sql来实现。

    C#自定义分页控件

    三、AspNetPager分页控件本身并不显示任何数据,而只显示分页导航元素,数据在页面上的显示方式与该控件无关,所以需要手写数据连接方法来配合, 四、结合TOP 。。。NOT IN 的通用存储过程分页方法使用AspNetPager...

    .net50个常用方法简单华丽的分页控件功能大的分页控件 50个实用方法

    ///SqlRunProc()执行存储过程 ///DataBindDropDownListDefault()DropDownList控件绑定 带默认选择项 如"请选择" ///DataBindDropDownList()DropDownList控件绑定 不带默认选择项 ///...

    net 分页控件,支持所有数据空间,使用存储过程

    net 分页控件,支持所有数据空间,使用存储过程,运行速度快

    Datagridview分页控件

    C#开发的Datagridview分页控件源码,采用的真分页非存储过程方式。支持每页显示条数,页跳转,当前页和全部页导出Excel功能。 使用方法。将本控件源码导入自己的新建项目中,整个项目编译一次后,工具箱会自动生成一...

    .NET2005分页控件(可使用分页存储过程)

    .NET2005分页控件(可使用分页存储过程) 可以对大数据量进行分页查询提高性能!

    .net 服务器端自定义分页控件

    参考网上的一此代码写的一个自定义分页控件,适用于gridview datalist等绑定数据源的控件。 此控件不对数据源进行处理,可以配合分页存储过程使用。 展开“工具箱”,右键-“选择项...”,将控件引入,用时从...

    C#分页控件

    用于C/S数据分页功能,配合分页存储过程非常方便处理数据分页加载。目前实现跳转至、上一页、下一页、每页条目等。

    基于asp.net2.0分页控件源码

    基于asp.net2.0分页控件源码 配合分页存储过程,轻轻松松进行千万级数据分页。 关于该控件的技术文章和使用方法: 之一: http://blog.csdn.net/46539492/archive/2008/04/02/2244627.aspx 之二: ...

    分页控件

    1.本版本的需要2.0框架支持 2.功能: 支持数据缓存 ...修正分页控件在删除当前索引也中所有行不能自动转到上一页的错误 如果您在使用中发现BUG或有很好的建议请联系我,让大家一起参与进来维护好这个控件.

    分页控件1.2.4.3

    修正分页控件在删除当前索引也中所有行不能自动转到上一页的错误 5.添加分页的排序方式 6.自定义排序的字段 7.修正在除GridView外表格控件绑定空数据库时出错问题 8.修正用户SQL语句后面带分号出错...

    winfrom 分页控件源码

    开发环境:VS2017,Sqlserver2008,.netframework2.0 功能介绍: 1. 支持SQL语句,存储过程,缓存分页。 2. 分页控件:分页信息展示;设置每页条数;上下翻页、转到第几页。 3. 提供测试表和测试数据

    无刷新的.net自定义分页控件, 灵活简洁

    1.真正分页, 只取需要的数据;...数据库太大, 而且版本多, 再加之痛恨网上流传的那个什么基于NorthWind的存储过程的无法运行的分页……你自己将我的Demo改成用数据库的也很容易; 十分, 一分钱一分货。呵呵……

    分页AspNetPager

    三、AspNetPager分页控件本身并不显示任何数据,而只显示分页导航元素,数据在页面上的显示方式与该控件无关,所以需要手写数据连接方法来配合, 四、结合TOP 。。。NOT IN 的通用存储过程分页方法使用AspNetPager...

    net实用类50超级实用方法赠分页分页控件强大的分页

    ///SqlRunProc()执行存储过程 ///DataBindDropDownListDefault()DropDownList控件绑定 带默认选择项 如"请选择" ///DataBindDropDownList()DropDownList控件绑定 不带默认选择项 ///DataBindRadioButtonList...

    VS2005(C#)DataGridView存储过程分页

    利用VS2005自带的控件DataGridView,BindingNavigator,BindingSource,存储过程读取数据实现的分页操作,利用存储过程分页比普通分页的速度快很多,可直接运行

    AspNetPager+存储过程分页

    AspNetPager+存储过程分页结合第三方控件AspNetPager控件的扩展界面和存储过程大批量数据的处理,本程序适合新手研究

    ASP.NET数据表现控件

    独创的支持存储过程分页. 2.可删除记录,并根据用户设定的条件决定是否可删除 3.可选择记录,提交后记忆选择行 4.设置记录模板,可以实现任意样式布局的网页 5.标志符合条件的某项 6.完全纯网页元素输出,显示快速....

Global site tag (gtag.js) - Google Analytics