ASP中实现分页显示的七种方法 |
|
在微软的ASP编程体系中,ADO对象的建立,使得从网页访问数据库成为一件易事,特别是ADO的Recordset对象使得控制数据的输出显示更为方便、自由 。而在Visual InterDev6.0(以下简称VI6.0)中,由于Script Object Model(以下简称SOM)、Design-Time Control(以下简称DTC)以及Data Environment Object Model(以下简称DEOM)等对象模型的引入,使网页对数据库的访问设计显得更为方便 。
<%//建立与employee.mdb数据库的连接 。
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=employee.mdb"
//建立emp表的Recordset对象实例rs 。
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "emp", conn, 3
PageSize = 10 //pagesize属性指定了每页要显示的记录条数
Page = CLng(Request("Page")) string型转化为long型
If Page < 1 Then Page = 1
If Page > rs.PageCount Then Page = rs.PageCount
If Page <> 1 Then
Response.Write "<A HREF=emp1.asp?Page=1>第一页</A>"
Response.Write "<A HREF=emp1.asp?Page=" & (Page-1) & ">上一页</A>"
End If
If Page <> rs.PageCount Then
Response.Write "<A HREF=emp1.asp?Page=" & (Page+1) & ">下一页</A>"
Response.Write "<A HREF=emp1.asp?Page="&rs.PageCount & ">最后一页</A>"
End If
Response.write"页码:" & Page & "/" & rs.PageCount & "</font>"
//每一页的显示
//显示表头
Response.Write "<CENTER><TABLE BORDER=1>"
Response.WRITE "<TR><TD>" & rs.Fields("emp ID").Name & "</TD>"
Response.WRITE "<TD>" & rs.Fields("last name").Name & "</TD>"
Response.WRITE "<TD>" & rs.Fields("first name").Name & "</TD></TR>"
//循环显示每条记录
rs.AbsolutePage = Page //把页码赋给absolutepage属性从而知当前页的首条记录号
For iPage = 1 To rs.PageSize //
Response.WRITE "<TR><TD>" & rs.Fields("emp ID").Value & "</TD>"
Response.WRITE "<TD>" & rs.Fields("first name").Value & "</TD>"
Response.WRITE "<TD>" & rs.Fields("last name").Value & "</TD></TR>"
rs.MoveNext
If rs.EOF Then Exit For
Next
Response.Write "</TABLE></CENTER>"%>
if Pagenum = "" Then Pagenum = 1 //从第一页开始显示
//建立数据库连接和Recordset对象实例rs 。
与第一种方法相同,此处略过 。
RS.Pagesize = 10 设置一页中显示的记录条数为10条
// 确定翻页的动作
Select Case Request("NAV")
Case ""
session("Pagenum") = 1
case "First" First Record
session("Pagenum") = 1
case "Prev" Previous Record
if session("Pagenum") > 1 then
session("Pagenum") = session("Pagenum") - 1
End If
case "Next" Next Record
if session("Pagenum")< RS.PageCount then
session("Pagenum") = session("Pagenum") + 1
End if
case "Last" Last Record
session("Pagenum") = RS.PageCount
End Select
RS.Absolutepage = Clng(session("Pagenum")) //确定当前页的第一条记录号
// 显示当前页
同第一种方法,此处略过 。
// Nav 翻页按钮设置
<form method="GET" action="emp2.asp">
<input type="submit" name="NAV" Value="首页">
<input type="submit" value="上页" name="NAV">
<input type="submit" value="下页" name="NAV">
<input type="submit" value="末页" name="NAV"></form>
第三种:用Grid控件设计分页 <TABLE ID="Table1" DATASRC="#Recordset1_RDS" DATAPAGESIZE=5> //假定前面设定Recordset控件名为Recordset1 。每页显示5条记录 。 <THEAD> <TH ALIGN="left" WIDTH=150>Emp ID</TH> //输出表头 <TH ALIGN="left" WIDTH=200>Last Name</TH> <TH ALIGN="left" WIDTH=200>First Name</TH> </THEAD> <TR> <TD><DIV DATAFLD="Emp ID"></DIV></TD> //输出表内容 <TD><DIV DATAFLD="Last Name"></DIV></TD> <TD><DIV DATAFLD="First Name"></DIV></TD> </TR> </TABLE> 第三步:然后,增加一对DTCs Button按钮控件来做翻页导航,一个命名为“btnPrevious”(上一页),一个命名为“btnNext”(下一页) 。它们相应的脚本如下: <SCRIPT LANGUAGE=VBScript> Function btnPrevious_onclick() Table1.previousPage() End Function Function btnNext_onclick() Table1.nextPage() End Function </SCRIPT> 第五种:DHTML法二 Dim gCurrentPageNumber //当前页号 Dim gMaxPageNumber //最大页数 Dim gRecordsPerPage //每页显示记录数 gRecordsPerPage = 5 // 设置每页显示记录数为5条记录 。 Function Recordset1_ondatasetcomplete() totalRecordCount = Recordset1.getCount() //总的记录条数 gMaxPageNumber = Int(totalRecordCount / gRecordsPerPage) //获得最大页数 If (totalRecordCount Mod gRecordsPerPage) > 0 then gMaxPageNumber = gMaxPageNumber + 1 End If End Function 第三步:创建翻页导航按钮 。 Function btnFirst_onclick() 翻到首页 gCurrentPageNumber = 1 DisplayData() End Function Function btnPrevious_onclick() 翻到上一页 if gCurrentPageNumber > 1 Then gCurrentPageNumber = gCurrentPageNumber - 1 DisplayData() End If End Function Function btnNext_onclick() 翻到下一页 if gCurrentPageNumber < gMaxPageNumber Then gCurrentPageNumber = gCurrentPageNumber + 1 DisplayData() End If End Function Function btnLast_onclick() 翻到末页 gCurrentPageNumber = gMaxPageNumber DisplayData() End Function 第四步:编写显示每一页的函数 。其中使用了许多DHTML的属性和方法,请读者自行参考相关书籍 。
Sub DisplayData()
startRecord = ((gCurrentPageNumber - 1) * gRecordsPerPage) + 1 //计算每一页开始显示的记录号数(位置,第几条)
rowCtr = 1
lblPageNumber.innerHTML = gCurrentPageNumber & "/" & gMaxPageNumber
For recordPtr = startRecord To (startRecord + gRecordsPerPage - 1) //循环显示一页的各条记录
If recordPtr > Recordset1.getCount() Then //显示空表
Table1.rows(rowCtr).cells(0).innerHTML = "<P> </P>"
Table1.rows(rowCtr).cells(1).innerHTML = "<P> </P>"
Table1.rows(rowCtr).cells(2).innerHTML = "<P> </P>"
Table1.rows(rowCtr).cells(3).innerHTML = "<P> </P>"
Else //具体显示每一页
Recordset1.moveAbsolute(recordPtr) //移动记录指针 。
empID = Recordset1.fields.getValue("emp ID")
empLName = Recordset1.fields.getValue("first name")
empFName = Recordset1.fields.getValue("last name")
Table1.rows(rowCtr).cells(0).innerText = recordPtr Counter
Table1.rows(rowCtr).cells(1).innerText = empID
Table1.rows(rowCtr).cells(2).innerText = empLName
Table1.rows(rowCtr).cells(3).innerText = empFName
End If
rowCtr = rowCtr + 1
Next
End Sub
另外,我们还需要在window对象的onload事件中编写如下脚本: For rowCtr = 1 to gRecordsPerPage Table1.insertRow(rowCtr) 插一新列 For cellCtr = 0 to 3 Table1.rows(rowCtr).insertCell() Next Next 第六种:服务器端控制翻页方法 。 Function Recordset1_ondatasetcomplete() recordsPerPage = 5 empList.setRecordsPerPage(recordsPerPage)//设置网页对象每页记录条数属性为5 totalRecordCount = Recordset1.getCount()//获得记录集的总条数 mpn = Int(totalRecordCount / recordsPerPage) //计算出mpn为总页数 If (totalRecordCount Mod recordsPerPage) > 0 then mpn = mpn + 1 End If empList.setMaxPageNumber(mpn) End Function 第四步:拖四个button控件到网页中,编写翻页控制脚本 。我们主要是通过改变网页对象的CurrentPageNumber属性的值来实现翻页 。 Function btnFirst_onclick() 翻到首页 empList.setCurrentPageNumber(1) End Function Function btnPrevious_onclick() 翻到上一页 cpn = empList.getCurrentPageNumber() if cpn > 1 Then empList.setCurrentPageNumber(cpn - 1) End If End Function Function btnNext_onclick() 翻到下一页 cpn = empList.getCurrentPageNumber() if cpn < empList.getMaxPageNumber() then empList.setCurrentPageNumber(cpn + 1) End If End Function Function btnLast_onclick() 翻到末页 empList.setCurrentPageNumber( empList.getMaxPageNumber() ) End Function 为保证首次进入该页时,显示的是第一页,我们还得编写该网页对象的onEnter事件 。
Function empList_onEnter()
If empList.firstEntered Then
empList.setCurrentPageNumber(1)
End If
End Function
第五步:编写显示每一页的脚本 。
<HR><TABLE BORDER=0><TR>//显示表头
<TH ALIGN="left" WIDTH=35></TH>
<TH ALIGN="left" WIDTH=150>Emp ID</TH>
<TH ALIGN="left" WIDTH=200>Last Name</TH>
<TH ALIGN="left" WIDTH=200>First Name</TH></TR>
<%
pageNumber = empList.getCurrentPageNumber()//计算翻页所需的各种参数,同DHTML法二
recordsPerPage = empList.getRecordsPerPage()
startRecord = ((pageNumber - 1) * recordsPerPage) + 1
lastRecord = Recordset1.getCount()
For recordPtr = startRecord To (startRecord + recordsPerPage - 1)%>
<%If Recordset1.EOF = True Then%>
<TR>
<TD> </TD>
<TD> </TD>
<TD> </TD>
<TD> </TD>
</TR>
<%Else%>
<%Recordset1.moveAbsolute(recordPtr)%>
<TR>
<% If recordPtr <= lastRecord Then %>
<TD><%=recordptr%></TD>
<%Else%>
<TD> </TD>
<% End If %>
<TD><%=Recordset1.fields.getValue("emp ID")%></TD>
<TD><%=Recordset1.fields.getValue("last name")%></TD>
<TD><%=Recordset1.fields.getValue("first name")%></TD>
</TR>
<%End If%>
<%Next%>
</TABLE><HR>
第七种:Data Environment Object Model(数据环境对象模型)法 第四步:因为rs为ADO对象,所以,以下的实现翻页代码完全参照以上介绍的几种方法,此处略过 。 |