创建一个ASP通用分页类(完整版)
所以趁昨天有空自己寫了一個分頁的類,自我感覺良好(不要用雞蛋砸我),在這里和大家分享一下自己的經驗(談不上經驗,感想吧)。在這里我也不想說分頁的原理了,反正大家都懂,要我往深入的談我也不會。呵呵。
一、創建分頁類的目標
在寫之前,我曾想過,我究竟要寫怎么樣一個類,回想起以前寫分頁過程的時候,最煩的莫過于每次都要寫哪一段復雜的分頁代碼,最大的煩惱每次都是僅僅幾個變量名的不同。所以第一個要實現的就是要把這個封裝起來,第二個就是要把分頁的導航條也封裝起來,第三個,不習慣哪些把數據顯示部分也封裝起來的方法,這不是方便編程,對與哪些對顯示效果每次都不同的用戶來說,比自己寫分頁還要麻煩。所以我的目地就是對RecordSet進行一些簡單的封裝。
二、創建過程
所以我寫的第一個屬性,就是返一個經過處理的RecordSe
Public Property Get GetRs()
? Set XD_Rs=Server.createobject("adodb.recordset")
? XD_Rs.PageSize=PageSize
? XD_Rs.Open XD_SQL,XD_Conn,1,1
? If not(XD_Rs.eof and XD_RS.BOF) Then
? If int_curpage>XD_RS.PageCount Then
int_curpage=XD_RS.PageCount
? End If
? XD_Rs.AbsolutePage=int_curpage
? End If
? Set GetRs=XD_RS
End Property
這個屬性的作用是更據指定RecordSet 的當前面,并到指針指向當前頁的第一條記錄,這個應該就是整個類的完成分頁的核心了,當然,其中的一些參數是靠其它的屬性來獲取,所以這里順便介紹一個這個類所要的基本參數
=============================================
'GetConn 得到數據庫連接
'
'=============================================
Public Property Let GetConn(obj_Conn)
? Set XD_Conn=obj_Conn
End Property
'=============================================
'GetSQL 得到查詢語句
'
'==============================================
Public Property Let GetSQL(str_sql)
? XD_SQL=str_sql
End Property
'===============================================
'PageSize 屬性
'設置每一頁的分頁大小
'===============================================
Public Property Let PageSize(int_PageSize)
? If IsNumeric(Int_Pagesize) Then
? XD_PageSize=CLng(int_PageSize)
? Else
? str_error=str_error & "PageSize的參數不正確"
? ShowError()
? End If
End Property
Public Property Get PageSize
? If XD_PageSize="" or (not(IsNumeric(XD_PageSize))) Then
? PageSize=10
? Else
? PageSize=XD_PageSize
? End If
End Property
以上幾個是在使用類的過程必需要指定的參數,曾經我在寫屬性的時候對每個傳入的參數加上IsObject(obj_conn)等判斷,為的是類的健壯,但是后來想來想去,這個對與ASP來說沒有必要,不加還能加快點速度,至于為什么這樣,我想各位在使用過程中也會發現,加還不如不加。這也是我經過了思想斗爭以后才去掉了,只保留了一些必要的驗證。
一個參數就是當前頁的獲得,在程序中我用int_curpage來標識,這個的話放在類的創建過程中獲得在好也沒有了
? '========================
? '設定一些參數的黙認值
? '========================
? XD_PageSize=10 '設定分頁的默認值為10
? '========================
? '獲取當前面的值
? '========================
? If request("page")="" Then
? int_curpage=1
? ElseIf not(IsNumeric(request("page"))) Then
? int_curpage=1
? ElseIf CInt(Trim(request("page")))<1 Then
? int_curpage=1
? Else
? Int_curpage=CInt(Trim(request("page")))
? End If?
End Sub
到這里這個類分的功能基本已經實現了,只要在調用這個類的頁面的URL后面加上page=n,它就會顯示第n頁的內容了,所以接下去要做的就是創建一個數據導航條了,我把它設計為類似以面的形式
9 3[1] [2] [3] [4] [5] [6] [7] [8] 4 :頁次:1/8頁 共51條記錄 7條/每頁
在頁面里通過調用ShowPage()的方法顯示出來,ShowPage可以在GetRS以后的任意位置調用,也可以調用多次
Public Sub ShowPage()
Dim str_tmp
int_totalRecord=XD_RS.RecordCount
If int_totalRecord<=0 Then
? str_error=str_error & "總記錄數為零,請輸入數據"
? Call ShowError()
End If
If int_totalRecord="" Then
? int_TotalPage=1
Else
? If int_totalRecord mod PageSize =0 Then
int_TotalPage = CLng(int_TotalRecord / XD_PageSize * -1)*-1
? Else
int_TotalPage = CLng(int_TotalRecord / XD_PageSize * -1)*-1+1
? End If
End If
If Int_curpage>int_Totalpage Then
? int_curpage=int_TotalPage
End If
'=====================================================
'顯示分頁信息,各個模塊根據自己要求更改顯求位置
'=====================================================
response.write "
str_tmp=ShowFirstPrv '顯示首頁、前一頁
response.write str_tmp?
str_tmp=showNumBtn '數字導航
response.write str_tmp
str_tmp=ShowNextLast? '下一頁、末頁
response.write str_tmp
str_tmp=ShowPageInfo
response.write str_tmp
response.write ""
end Sub
到這里類的功能才算完整(為了節省版面,我有些方法沒有放上去,再下面附上全部完整代碼)寫一個簡單頁面測試一下
<%?
’把分頁類包含進來
set conn = server.CreateObject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq=" & server.Mappath("pages.mdb")
'#############類調用樣例#################
'創建對象
Set mypage=new xdownpage
'得到數據庫連接
mypage.getconn=conn
'sql語句
mypage.getsql="select * from [test] order by id asc"
'設置每一頁的記錄條數據為5條
mypage.pagesize=5
'返回Recordset
set rs=mypage.getrs()
'顯示分頁信息,這個方法可以,在set rs=mypage.getrs()以后,可在任意位置調用,可以調用多次
mypage.showpage()
'顯示數據
Response.Write("<br/>")
for i=1 to mypage.pagesize
'這里就可以自定義顯示方式了
??? if not rs.eof then
??????? response.write rs(0) & "<br/>"
??????? rs.movenext
??? else
???????? exit for
??? end if
next
%>
?
效果還不錯,該有的全有了。
分頁過程中,還有一個比軟麻煩的問題是,在帶多個參數的URL中,如保證在頁面轉向的時候不掉失其它參數。我靠一個GetURL的過程來實現,并在生成導航時調用。
Private Function GetURL()
? Dim strurl,str_url,i,j,search_str,result_url
? search_str="page="
? strurl=Request.ServerVariables("URL")
? Strurl=split(strurl,"/")
? i=UBound(strurl,1)
? str_url=strurl(i)'得到當前頁文件名
? str_params=Request.ServerVariables("QUERY_STRING")
? If str_params="" Then
? result_url=str_url & "?page="
? Else
? If InstrRev(str_params,search_str)=0 Then
result_url=str_url & "?" & str_params &"&page="
? Else
j=InstrRev(str_params,search_str)-2
If j=-1 Then
? result_url=str_url & "?page="
Else
? str_params=Left(str_params,j)
? result_url=str_url & "?" & str_params &"&page="
End If
? End If
? End If
? GetURL=result_url
End Function
通過GetURL的處理,可以自動的獲取當前面的文件名,和所有帶的參數,實現了頁面轉換頁不丟失參數。
三、后記
通過這個分頁類,解決了每次分頁時需要重復寫的分頁部分代碼,方便了編程,也使的提高了主要代碼的可讀性。也希望能給大家在編程過程中帶來一點方便,由于本人水平有限,程序和文章中難免有錯,還望大家批評指正。
全部代碼下載
?
?
附全部代碼:
<%
'===================================================================
'XDOWNPAGE?? ASP版本
'版本?? 1.00
'Code by? zykj2000
'Email:?? zykj_2000@163.net
'BBS:?? http://bbs.513soft.net
'本程序可以免費使用、修改,希望我的程序能為您的工作帶來方便
'但請保留以上請息
'
'程序特點
'本程序主要是對數據分頁的部分進行了封裝,而數據顯示部份完全由用戶自定義,
'支持URL多個參數
'
'使用說明
'程序參數說明
'PapgeSize????? 定義分頁每一頁的記錄數
'GetRS?????? 返回經過分頁的Recordset此屬性只讀
'GetConn????? 得到數據庫連接
'GetSQL?????? 得到查詢語句
'程序方法說明
'ShowPage????? 顯示分頁導航條,唯一的公用方法
'
'===================================================================
Const Btn_First="<font face=""webdings"">9</font>"? '定義第一頁按鈕顯示樣式
Const Btn_Prev="<font face=""webdings"">3</font>"? '定義前一頁按鈕顯示樣式
Const Btn_Next="<font face=""webdings"">4</font>"? '定義下一頁按鈕顯示樣式
Const Btn_Last="<font face=""webdings"">:</font>"? '定義最后一頁按鈕顯示樣式
Const XD_Align="Center"???? '定義分頁信息對齊方式
Const XD_Width="100%"???? '定義分頁信息框大小
Class Xdownpage
Private XD_PageCount,XD_Conn,XD_Rs,XD_SQL,XD_PageSize,Str_errors,int_curpage,str_URL,int_totalPage,int_totalRecord,XD_sURL
'=================================================================
'PageSize 屬性
'設置每一頁的分頁大小
'=================================================================
Public Property Let PageSize(int_PageSize)
?If IsNumeric(Int_Pagesize) Then
? XD_PageSize=CLng(int_PageSize)
?Else
? str_error=str_error & "PageSize的參數不正確"
? ShowError()
?End If
End Property
Public Property Get PageSize
?If XD_PageSize="" or (not(IsNumeric(XD_PageSize))) Then
? PageSize=10????
?Else
? PageSize=XD_PageSize
?End If
End Property
'=================================================================
'GetRS 屬性
'返回分頁后的記錄集
'=================================================================
Public Property Get GetRs()
?Set XD_Rs=Server.createobject("adodb.recordset")
?XD_Rs.PageSize=PageSize
?XD_Rs.Open XD_SQL,XD_Conn,1,1
?If not(XD_Rs.eof and XD_RS.BOF) Then
? If int_curpage>XD_RS.PageCount Then
?? int_curpage=XD_RS.PageCount
? End If
? XD_Rs.AbsolutePage=int_curpage
?End If
?Set GetRs=XD_RS
End Property
'================================================================
'GetConn? 得到數據庫連接
'
'================================================================
Public Property Let GetConn(obj_Conn)
?Set XD_Conn=obj_Conn
End Property
'================================================================
'GetSQL?? 得到查詢語句
'
'================================================================
Public Property Let GetSQL(str_sql)
?XD_SQL=str_sql
End Property
?
'==================================================================
'Class_Initialize 類的初始化
'初始化當前頁的值
'
'==================================================================
Private Sub Class_Initialize
?'========================
?'設定一些參數的黙認值
?'========================
?XD_PageSize=10? '設定分頁的默認值為10
?'========================
?'獲取當前面的值
?'========================
?If request("page")="" Then
? int_curpage=1
?ElseIf not(IsNumeric(request("page"))) Then
? int_curpage=1
?ElseIf CInt(Trim(request("page")))<1 Then
? int_curpage=1
?Else
? Int_curpage=CInt(Trim(request("page")))
?End If
?
End Sub
'====================================================================
'ShowPage? 創建分頁導航條
'有首頁、前一頁、下一頁、末頁、還有數字導航
'
'====================================================================
Public Sub ShowPage()
?Dim str_tmp
?XD_sURL = GetUrl()
?int_totalRecord=XD_RS.RecordCount
?If int_totalRecord<=0 Then
? str_error=str_error & "總記錄數為零,請輸入數據"
? Call ShowError()
?End If
?If int_totalRecord="" then
???? int_TotalPage=1
?Else
? If int_totalRecord mod PageSize =0 Then
?? int_TotalPage = CLng(int_TotalRecord / XD_PageSize * -1)*-1
? Else
?? int_TotalPage = CLng(int_TotalRecord / XD_PageSize * -1)*-1+1
? End If
?End If
?
?If Int_curpage>int_Totalpage Then
? int_curpage=int_TotalPage
?End If
?
?'==================================================================
?'顯示分頁信息,各個模塊根據自己要求更改顯求位置
?'==================================================================
?response.write ""
?str_tmp=ShowFirstPrv
?response.write str_tmp
?str_tmp=showNumBtn
?response.write str_tmp
?str_tmp=ShowNextLast
?response.write str_tmp
?str_tmp=ShowPageInfo
?response.write str_tmp
?
?response.write ""
End Sub
'====================================================================
'ShowFirstPrv? 顯示首頁、前一頁
'
'
'====================================================================
Private Function ShowFirstPrv()
?Dim Str_tmp,int_prvpage
?If int_curpage=1 Then
? str_tmp=Btn_First&" "&Btn_Prev
?Else
? int_prvpage=int_curpage-1
? str_tmp="<a href="""&XD_sURL & "1" & """>" & Btn_First&"</a> <a href=""" & XD_sURL & CStr(int_prvpage) & """>" & Btn_Prev&"</a>"
?End If
?ShowFirstPrv=str_tmp
End Function
'====================================================================
'ShowNextLast? 下一頁、末頁
'
'
'====================================================================
Private Function ShowNextLast()
?Dim str_tmp,int_Nextpage
?If Int_curpage>=int_totalpage Then
? str_tmp=Btn_Next & " " & Btn_Last
?Else
? Int_NextPage=int_curpage+1
? str_tmp="<a href=""" & XD_sURL & CStr(int_nextpage) & """>" & Btn_Next&"</a> <a href="""& XD_sURL & CStr(int_totalpage) & """>" &? Btn_Last&"</a>"
?End If
?ShowNextLast=str_tmp
End Function
'====================================================================
'ShowNumBtn? 數字導航
'
'
'====================================================================
Private Function showNumBtn()
?Dim i,str_tmp
?For i=1 to int_totalpage
? str_tmp=str_tmp & "[<a href=""" & XD_sURL & CStr(i) & """>"&i&"</a>] "
?Next
?showNumBtn=str_tmp
End Function
'====================================================================
'ShowPageInfo? 分頁信息
'更據要求自行修改
'
'====================================================================
Private Function ShowPageInfo()
?Dim str_tmp
?str_tmp="頁次:"&int_curpage&"/"&int_totalpage&"頁 共"&int_totalrecord&"條記錄 "&XD_PageSize&"條/每頁"
?ShowPageInfo=str_tmp
End Function
'==================================================================
'GetURL? 得到當前的URL
'更據URL參數不同,獲取不同的結果
'
'==================================================================
Private Function GetURL()
?Dim strurl,str_url,i,j,search_str,result_url
?search_str="page="
?
?strurl=Request.ServerVariables("URL")
?Strurl=split(strurl,"/")
?i=UBound(strurl,1)
?str_url=strurl(i)'得到當前頁文件名
?
?str_params=Trim(Request.ServerVariables("QUERY_STRING"))
?If str_params="" Then
? result_url=str_url & "?page="
?Else
? If InstrRev(str_params,search_str)=0 Then
?? result_url=str_url & "?" & str_params &"&page="
? Else
?? j=InstrRev(str_params,search_str)-2
?? If j=-1 Then
??? result_url=str_url & "?page="
?? Else
??? str_params=Left(str_params,j)
??? result_url=str_url & "?" & str_params &"&page="
?? End If
? End If
?End If
?GetURL=result_url
End Function
'====================================================================
' 設置 Terminate 事件。
'
'====================================================================
Private Sub Class_Terminate?
?XD_RS.close
?Set XD_RS=nothing
End Sub
'====================================================================
'ShowError? 錯誤提示
'
'
'====================================================================
Private Sub ShowError()
?If str_Error <> "" Then
? Response.Write("" & str_Error & "")
? Response.End
?End If
End Sub
End class
?
set conn = server.CreateObject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq=" & server.Mappath("pages.mdb")
'#############類調用樣例#################
'創建對象
Set mypage=new xdownpage
'得到數據庫連接
mypage.getconn=conn
'sql語句
mypage.getsql="select * from [test] order by id asc"
'設置每一頁的記錄條數據為5條
mypage.pagesize=5
'返回Recordset
set rs=mypage.getrs()
'顯示分頁信息,這個方法可以,在set rs=mypage.getrs()以后,可在任意位置調用,可以調用多次
mypage.showpage()
'顯示數據
Response.Write("<br/>")
for i=1 to mypage.pagesize
'這里就可以自定義顯示方式了
??? if not rs.eof then
??????? response.write rs(0) & "<br/>"
??????? rs.movenext
??? else
???????? exit for
??? end if
next
%>
轉載于:https://www.cnblogs.com/MaxIE/archive/2006/03/18/352509.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的创建一个ASP通用分页类(完整版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在VS2003中以ClassLibrar
- 下一篇: vs2005's addin folde