主题:  [讨论]ASP.net中DataGrid的分页问题,请指点

dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
#12004/10/19 14:30:17

我看了一下DataGrid的自动分页设置参数,估计其是读出所数据,然后根据设置的参数,计算出每页要显示的记录起始和结尾位置,然后显示。

每翻一次页要重新绑定一次,显然又重新读了一次全部数据。。。这种分页显示的代价似乎很高,因为每次都要读全部记录,而只用“一小块记录”。。。浪费!

ASP.net中DataGrid的自动分页功能太简单,不利于做出好看的导航条。于是我自己编写了分页模块,做法与上述相同,参照下图的图示。
=====================
同样,为了每次显示的一个页面,要读出所有记录,每翻一次页就得读一次数据库,而且本页之外的其它记录读出来后根本没用,资源浪费啊。。。。(假如每次只取得自己想要的记录,这样效率高且节约资源。。。呵呵,,,,)
=========================
0、DataGrid设成不分页
1、首先读出所要显示的数据放在一个DATATABLE中,但不直接将其绑定到DataGrid中
2、根据分页的大小(每页显示的记录条数),和要显示的分页号(即第几页),编写子程序计算出该页的要显示的首记录和尾记录号,将“这一块数据”放到一个DataView中。
3、将DataView作为DataGrid的数据源 ,并绑定。

========================
OK了!
图示如下:



图片如下:


这是完成的分页导航显示页面的初稿:

图片如下:

编辑历史:[此帖最近一次被 dreamexpress 编辑过(编辑时间:2004-10-19 15:01:47)]


dreamexpress_5d

职务:普通成员
等级:1
金币:10.0
发贴:2229
#22004/10/19 14:55:48
关键是
DataTable的数据,没有让那些“翻页按钮”“共享”,每次翻页都要去数据库中取数据。

有做法是将第一次读出的全部数据(DataTable)放到一个Session变量中保存,这样每次翻页时就不要从数据库中读了。但如有数千万条记录,保存DATATABLE到Session变量中好象会出错,也会增加服务器的负担。。。。

问题转化为:保存全部数据的DataTable的如何“重复使用”呢???



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#32004/10/19 16:16:07
方法有很多,第一个要点是先得到记录总条数
SELECT COUNT(*) FROM Table1

然后用DataReader读取记录条数,可用ExecuteScalar()方法读取,再进行运算
int RecordCount; //读取总记录数
int PageSize; // 每页大小
int CurrentPage; //当前页码
int TotalCount = (int)Math.Ceiling(RecordCount / PageSize) //总页数

读取第一页,
SELECT TOP @PageSize FROM Table1 ORDER BY Table1ID DESC

每次页面刷新后,记录显示的第一条及最后一条的ID
intStartID、intEndID

前翻(注意这里是用倒排序):
SELECT TOP @PageSize FROM Table1 WHERE Table1ID > @StartID ORDER BY Table1ID DESC

后翻:
SELECT TOP @PageSize FROM Table1 WHERE Table1ID < @EndID ORDER BY Table1ID DESC

不过这种方法有缺点,就是如果有新记录增加,就会有问题,另外,不能直接翻到指点页。本方法只适用于很大的数据量。

另外方法是进行先过滤,按日期或分类进行后的数据,再进行显示第几条到第几条。

分页方法再探讨!!!欢迎!!!


非常大鱼

damoo

职务:普通成员
等级:1
金币:1.0
发贴:28
#42004/10/20 10:16:42
已经有人讨论出了一个比较完备的结果,见
blog.csdn.net/lihonggen0/archive/2004/09/14/103511.aspx



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#52004/10/20 10:28:02
楼上的那种方法不错,用SQL,又学了一招。


非常大鱼

黑睿

职务:普通成员
等级:1
金币:0.0
发贴:7
#62004/11/3 18:07:33
前翻(注意这里是用倒排序):
SELECT TOP @PageSize FROM Table1 WHERE Table1ID > @StartID ORDER BY Table1ID DESC

后翻:
SELECT TOP @PageSize FROM Table1 WHERE Table1ID < @EndID ORDER BY Table1ID DESC

我觉得这种方法的速度应该是很快的,不过好像应用起来还有很多地方需要研究。

我是菜的要命,有没有哪位高手再继续这个代码?



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#72004/11/3 19:15:19
黑睿在上个帖子中说
引用:
前翻(注意这里是用倒排序):
SELECT TOP @PageSize FROM Table1 WHERE Table1ID > @StartID ORDER BY Table1ID DESC

后翻:
SELECT TOP @PageSize FROM Table1 WHERE Table1ID < @EndID ORDER BY Table1ID DESC

我觉得这种方法的速度应该是很快的,不过好像应用起来还有很多地方需要研究。

我是菜的要命,有没有哪位高手再继续这个代码?


我这个代码是个半成品,再下面不是有个连接,看清了?这个代码就比较完善了。


非常大鱼