ASP.NET处理数据分页(1)

发表于:2007-06-30来源:作者:点击数: 标签:
在ASP的 数据库 编程的时,由于浏览器的大小限制,在要浏览的数据记录比较多的时候,为了达到更直观的效果,我们把这些数据记录分成若干的页面,通过数据导航按钮(或者其他超链接),分页的浏览。其实这种数据记录的分页浏览在ASP.NET也能够实现。并且在实现
在ASP的数据库编程的时,由于浏览器的大小限制,在要浏览的数据记录比较多的时候,为了达到更直观的效果,我们把这些数据记录分成若干的页面,通过数据导航按钮(或者其他超链接),分页的浏览。其实这种数据记录的分页浏览在ASP.NET也能够实现。并且在实现的过程中比起在ASP的处理过程显得条理更清晰,也更容易些。  

通过浏览器进行分页浏览数据记录基本类型主要有二种。其他类型的分页浏览要么是对这二种类型的修改,要么是对这二种类型的综合。具体表现方式的如下面这二幅图:  

下面就来探讨一下在ASP.NET中这二种分页浏览数据记录的具体实现过程:  

首先来介绍一下我们使用的数据库,在本文中为了方便起见,我们使用了本地数据库Aclearcase/" target="_blank" >ccess 2000,数据库名称为@#Data.mdb@#,里面存放了一张数据表@#tblItem@#。此数据表的结构如下:  

字段名称 字段类型  
ItemID 自动编号  
ItemName 文本类型  


如果你采用的是别的数据库,只需对下面介绍的程序进行简单的修改就可以了。这将在下面介绍。  

一. 本文程序设计和运行的软件环境:  

(1).微软公司视窗2000版  

(2)..Net FrameWork SDK Beta 2  

二. 第一种分页浏览数据记录的关键步骤以及实现方法:  

(1).首先要得到初始浏览数据记录的超链接字符串:  

这其实很关键,因为在第一种分页浏览中的@#首页@#、@#下一页@#等操作,都是通过在这个超链接字符串后面加入要浏览页面的参数来实现的,在本文的程序中是通过GetPageName ( )函数来实现的。此函数具体如下:  

Function GetPageName ( ) As String
  Dim Str As String
  Dim Pos As Short
  Str = Request.ServerVariables ( @#Script_Name@# ).Trim ( )
  Pos = Str.LastIndexOf ( @#/@# )
  If Pos >= 0 Then
  Return Str.SubString ( Pos + 1 )
  Else
  Return Str
  End If
  End Function  


(2).要得到你所要浏览的数据记录总数:  

在本文中,为了方便,我们是把数据表@#tblItem@#中的全部记录都拿来浏览。ASP.NET页面通过ADO.NET来得到数据表@#tblItem@#。下面代码就是利用ADO.NET来得到@#tblItm@#表中记录总数的程序代码:  

<% @ Page Language = @#VB@# %>
  <% @ Import Namespace = @#System.Data@# %>
  <% @ Import Namespace = @#System.Data.OleDb@# %>
  <script runat = @#server@# >
  Dim strConn As String @#定义数据连接字符串  
Dim SQL As String  @#定义SQL语句
  Dim odConn As OleDbConnection
  Dim odAdapt As OleDbDataAdapter
  Dim DS As DataSet @#创建DataSet对象
  Dim DT As DataTable @#创建DataTable对象
  Dim nStart As Integer @#存放当前页面的起始记录序号
  Dim nEnd As Integer @#存放当前页面的终止记录序号
  Dim i As Integer  

@#确认要浏览的页面序号
nPage = Convert.ToInt32 ( Request.QueryString ( @#Page@# ) )
  SQL = @#SELECT * FROM tblItem @#
  
  @#创建数据连接字符串
  strConn = @# Provider = Microsoft.Jet.OLEDB.4.0 ; @# & _
  @# Data Source = @# & Server.MapPath ( @#data.mdb@# ) & @# ; @# & _
  @# User ID = ; Password = ; @#
  Try
  @#得到数据记录总数
  odConn = New OleDbConnection ( strConn )
  odAdapt = New OleDbDataAdapter ( SQL , odConn )
  DS = New DataSet
  odAdapt.Fill ( DS )
  DT = DS.Tables ( 0 )
  @#得到数据记录总数
  nRecCount = DT.Rows.Count
  Catch e As Exception
  Response.Write(@#错误信息: <b>@# & e.Message & @#</b><p>@#)
  nRecCount = 0
  End Try
  </script >  


(3).计算出浏览的数据记录总共页面数:  

在浏览页面中,我们发现了每一页只浏览5条记录,你可以通过修改程序中定义一个常量@#Record_Per_Page@#来改变每一页浏览数据记录的个数。在知道了要浏览数据记录的总数后,通过下面代码来计算出要显示这些数据记录所需要的页面总数:  

Const Record_Per_Page   As Short = 5 @#定义每一页显示的记录数
  Dim nPageCount As Integer @#保存总共的数据页面数目
  Dim nPage As Integer @#存放要浏览当前数据页面号
  nPageCount = nRecCount \ Record_Per_Page
  If nRecCount Mod Record_Per_Page > 0 Then
  nPageCount += 1
  End If
  @#确认浏览命令中的页面参数是否越界,如果越界则重置页面序号
  If nPage < 1  Then
  nPage = 1  
End If
  If  nPage > nPageCount Then
  nPage = nPageCount  
End If  


(4).数据导航的实现方法:  

其实数据导航是通过对参数@#Page@#赋值来实现的,其中程序中的@#nPage@#是当前数据页面序号, @#nPageCount@#是数据页面的总和。下面是实现这些数据导航的具体实现代码:  

Response.Write ( @# <p >数据导航:<A HREF = @#@#@# & Script_Name & _
  @#?Page=@# & ( 1 ).ToString ( ) & _
  @#@#@#>首  页 </A >@# )
  Response.Write( @#      @# )
  @#浏览@#上一页@#处理办法
  Response.Write ( @# <A HREF = @#@#@# & Script_Name & _
  @#?Page=@# & ( nPage - 1 ).ToString ( ) & _
  @#@#@# >上一页</A > @# )
  Response.Write ( @#     @# )
  @#浏览@#下一页@#处理办法
  Response.Write ( @#<A HREF =@#@#@# & Script_Name &  _
  @#?Page=@# & ( nPage + 1 ).ToString ( ) & _
  @#@#@# >下一页</A > @# )
  Response.Write ( @#    @# )
  @#浏览@#尾页@#处理办法
  Response.Write ( @#<A HREF = @#@#@# & Script_Name &  _
  @#?Page=@# & ( nPageCount ).ToString ( ) & _
  @#@#@# >尾  页</A > @# )
  @#显示当前页和合计页数
  Response.Write ( @#    @# & @#页次:@#& nPage.ToString ( )  & @#/@# & nPageCount.ToString ( ) & @# <br > @# )  


(5).显示不同页面的数据记录:  

根据超链接字符串得到@#Page@#值,然后根据此值来得到在此页面中要显示的起始记录号和结束记录号,再通过一个循环把这些记录给显示出来。下面这行代码是读取参数@#Page@#:  

nPage = Convert.ToInt32 ( Request.QueryString ( @#Page@# ) )  


下面这些代码是根据用户想要去的页面得到起始记录号和结尾记录号,并通过屏幕显示出来:  

Dim nStart As Integer @#存放当前页面的起始记录序号
  Dim nEnd As Integer @#存放当前页面的终止记录序号
  Dim i As Integer  
nStart = Record_Per_Page *  ( nPage - 1 )
  nEnd = nStart + Record_Per_Page - 1
  If nEnd > nRecCount - 1 Then
  nEnd = nRecCount - 1
  End If
  @#在屏幕中输出记录
  For i = nStart To nEnd
  Response.Write ( DT.Rows ( i ) ( @#ItemName@# ) & @# <br > @# )
  Next
    
在本文介绍的二种分页浏览记录类型中,对于数据显示,我们采用了简化处理。我们知道在浏览器上,浏览记录一般都是通过DbGrid的形式来实现的,这一点在其实也好实现,读者只需稍微修改一下本文中的程序代码就可以实现。  

三. 第一种分页浏览数据记录的完整程序代码(no1.aspx):  

组织一下上面的这些步骤的实现方法,可以得到下列完整代码:  

<% @ Page Language = @#VB@# %>
<% @ Import Namespace = @#System.Data@# %>
<% @ Import Namespace = @#System.Data.OleDb@# %>
<script runat = @#server@# >
Const Record_Per_Page As Short = 5 @#定义每一页显示的记录数
Private Script_Name As String  

Sub Page_Load ( Source As Object , e As EventArgs )
Script_Name = GetPageName ( )
@#第一种方式来分页显示数据
ShowRecords ( )
End Sub
@#得到起始浏览超链接字符串
Function GetPageName ( ) As String
Dim Str As String
Dim Pos As Short
Str = Request.ServerVariables ( @#Script_Name@# ).Trim ( )
Pos = Str.LastIndexOf ( @#/@# )
If Pos >= 0 Then
Return Str.SubString ( Pos + 1 )
Else
Return Str
End If
End Function

@#此函数的功能是分页显示数据库中的记录
Private Sub ShowRecords ( )
Dim strConn As String @#定义数据连接字符串  
Dim SQL As String @#定义SQL语句
Dim odConn As OleDbConnection
Dim odAdapt As OleDbDataAdapter
Dim DS As DataSet @#创建DataSet对象
Dim DT As DataTable @#创建DataTable对象
Dim nRecCount As Integer @#保存记录总数
Dim nPageCount As Integer @#保存总共的数据页面数目
Dim nPage As Integer @#存放要浏览当前数据页面号
Dim nStart As Integer @#存放当前页面的起始记录序号
Dim nEnd As Integer @#存放当前页面的终止记录序号
Dim i As Integer  

@#确认要浏览的页面序号
nPage = Convert.ToInt32 ( Request.QueryString ( @#Page@# ) )
SQL = @#SELECT * FROM tblItem @#

@#创建数据连接字符串
strConn = @# Provider = Microsoft.Jet.OLEDB.4.0 ; @# & _
@# Data Source = @# & Server.MapPath ( @#data.mdb@# ) & @# ; @# & _
@# User ID = ; Password = ; @#
Try
@#得到数据记录总数
odConn = New OleDbConnection ( strConn )
odAdapt = New OleDbDataAdapter ( SQL , odConn )
DS = New DataSet
odAdapt.Fill ( DS )
DT = DS.Tables ( 0 )
nRecCount = DT.Rows.Count
Catch e As Exception
Response.Write(@#错误信息: <b>@# & e.Message & @#</b><p>@#)
nRecCount = 0
End Try

@#判断是否存在数据记录
If nRecCount > 0 Then
@# 确定数据记录要显示的页面数
nPageCount = nRecCount \ Record_Per_Page
If nRecCount Mod Record_Per_Page > 0 Then
nPageCount += 1
End If

@#确认浏览命令中的页面参数是否越界,如果越界则重置页面序号
If nPage < 1 Then
nPage = 1  
End If
If nPage > nPageCount Then
nPage = nPageCount  
End If

Response.Write ( @#总共有数据记录@# & nRecCount.ToString ( ) & @# 条@# & @#。<br >@# )
Response.Write(@# <p > <b >第一种分页显示为:</b > <p > @# )

@#确认当前页面的开始记录和终止记录
nStart = Record_Per_Page * ( nPage - 1 )
nEnd = nStart + Record_Per_Page - 1
If nEnd > nRecCount - 1 Then
nEnd = nRecCount - 1
End If
@#在屏幕中输出记录
For i = nStart To nEnd
Response.Write ( DT.Rows ( i ) ( @#ItemName@# ) & @# <br > @# )
Next
End If
@#浏览@#首页@#处理办法
Response.Write ( @# <p >数据导航:<A HREF = @#@#@# & Script_Name & _
@#?Page=@# & ( 1 ).ToString ( ) & _
@#@#@#>首 页 </A >@# )
Response.Write( @#      @# )
@#浏览@#上一页@#处理办法
Response.Write ( @# <A HREF = @#@#@# & Script_Name & _
@#?Page=@# & ( nPage - 1 ).ToString ( ) & _
@#@#@# >上一页</A > @# )
Response.Write ( @#     @# )
@#浏览@#下一页@#处理办法
Response.Write ( @#<A HREF =@#@#@# & Script_Name & _
@#?Page=@# & ( nPage + 1 ).ToString ( ) & _
@#@#@# >下一页</A > @# )
Response.Write ( @#    @# )
@#浏览@#尾页@#处理办法
Response.Write ( @#<A HREF = @#@#@# & Script_Name & _
@#?Page=@# & ( nPageCount ).ToString ( ) & _
@#@#@# >尾 页</A > @# )
@#显示当前页和合计页数
Response.Write ( @#    @# & @#页次:@#& nPage.ToString ( ) & @#/@# & nPageCount.ToString ( ) & @# <br > @# )
End Sub
</script >  

原文转自:http://www.ltesting.net