ASP分页类(支持多风格变换)

时间:2022-06-01 12:44:23

ASP分页类(支持多风格变换)


这个分页使用的是0游标,也就是Rs.Open Sql,Conn,0,1。但是感觉也快不了多少,10万条数据的分页时间300多豪秒之间。

复制代码代码如下:


<% 
'****************************** 
'名称:分页类 
'日期:2005/12/3 
'作者:西楼冷月 
'网址:www.xilou.net | www.chinaCMS.org 
'描述:无 
'版权:转载请注名出处,作者 
'****************************** 
Class Page 
Private CurrPage 
Private PageN 
Private UrlStr 
Private TempStr 
Private ErrInfo 
Private IsErr 
Private TotalRecord 
Private TotalPage 
Public PageRs 
Private TempA(11) 
Private TempB(8) 
'------------------------------------------------------------ 
Private Sub Class_Initialize() 
CurrPage=1'//默认显示当前页为第一页 
PageN=10'//默认每页显示10条数据 
UrlStr="#" 
TempStr="" 
ErrInfo="ErrInfo:" 
IsErr=False 
End Sub 
Private Sub Class_Terminate() 
If IsObject(PageRs) Then 
PageRs.Close 
Set PageRs=Nothing 
End If 
Erase TempA 
Erase TempB 
End Sub 
'---------------------------------------------------------- 
'//获取当前页码 
Public Property Let CurrentPage(Val) 
CurrPage=Val 
End Property 
Public Property Get CurrentPage() 
CurrentPage=CurrPage 
End Property 
'//获取每页显示条数 
Public Property Let PageNum(Val) 
PageN=Val 
End Property 
Public Property Get PageNum() 
PageNum=PageN 
End Property 
'//获取URL 
Public Property Let Url(Val) 
UrlStr=Val 
End Property 
Public Property Get Url() 
Url=UrlStr 
End Property 
'//获取模板 
Public Property Let Temp(Val) 
TempStr=Val 
End Property 
Public Property Get Temp() 
Temp=TempStr 
End Property 
'------------------------------------------------------------ 
Public Sub Exec(Sql,ConnObj) 
On Error Resume Next 
Set PageRs=Server.CreateObject("ADODB.RecordSet") 
PageRs.CursorLocation = 3 '使用客户端游标,可以使效率提高 
PageRs.PageSize = PageN '定义分页记录集每页显示记录数 
PageRs.Open Sql,ConnObj,0,1 
If Err.Number<>0 Then 
Err.Clear 
PageRs.Close 
Set PageRs=Nothing 
ErrInfo=ErrInfo&"建立或打开记录集错误..." 
IsErr=True 
Response.Write ErrInfo 
Response.End 
End If 
TotalRecord=PageRs.RecordCount'//如果为0呢? 
If TotalRecord>=1 Then 
'----------------------------------------------------------------------------开始 
'//计算总页数,Ps,为什么不用PageRs.PageCount呢? 
'If TotalRecord Mod PageN=0 Then 
'TotalPage=PageRs.RecordCount\PageN 
'Else 
'TotalPage=PageRs.RecordCount\PageN 
'TotalPage=Abs(Int(TotalPage)) 
'End If 
TotalPage=PageRs.PageCount 
'//处理当前接收页码,默认的为1,所以不是数字类型的都会为1 
If IsNumeric(CurrPage) Then 
CurrPage=CLNg(CurrPage) 
If CurrPage<1 Then CurrPage=1 
If CurrPage>TotalPage Then CurrPage=TotalPage 
Else 
'//Dim M:M="":IsNumeric(M)=True 
CurrPage=1 
End If 
'---------------------------------------------------------------------------结束 
Else 
TotalPage=0 
CurrPage=1 
End If 
'// 
PageRs.AbsolutePage = CurrPage 'absolutepage:设置指针指向某页开头 
PageRs.PageSize=PageN 
End Sub 
Private Sub Init() 
'Private TempA(10) 
TempA(1)="{N1}" '//首页 
TempA(2)="{N2}"'//上一页 
TempA(3)="{N3}"'//下一页 
TempA(4)="{N4}"'//尾页 
TempA(5)="{N5}"'//当前页码 
TempA(6)="{N6}"'//页码总数 
TempA(7)="{N7}"'//每页条数 
TempA(8)="{N8}"'//文章总数 
TempA(9)="{L}"'//循环标签开始 
TempA(10)="{N}"'//循环内单标签:页码 
TempA(11)="{L/}"'//循环标签结束 
'Private TempB(8) 
TempB(1)="首页" 
TempB(2)="上一页" 
TempB(3)="下一页" 
TempB(4)="尾页" 
TempB(5)=CurrPage'//当前页码 
TempB(6)=TotalPage'//页码总数 
TempB(7)=PageN'//每页条数 
TempB(8)=TotalRecord'//文章总数 
End Sub 
Public Sub Show(Style) 
If IsErr=True Then 
Response.Write ErrInfo 
Exit Sub 
End If 
Call Init() 
Select Case Style 
Case 1 
Response.Write StyleA() 
Case 2 
Response.Write StyleB() 
Case 3 
Response.Write StyleC() 
Case 4 
Response.Write StyleD() 
Case Else 
ErrInfo=ErrInfo&"不存在当前样式..." 
Response.Write ErrInfo 
End Select 
End Sub 
Public Function ShowStyle(Style) 
If IsErr=True Then 
ShowStyle=ErrInfo 
Exit Function 
End If 
Call Init() 
Select Case Style 
Case 1 
ShowStyle= StyleA() 
Case 2 
ShowStyle= StyleB() 
Case Else 
ErrInfo=ErrInfo&"不存在当前样式..." 
ShowStyle=ErrInfo 
End Select 
End Function 
Private Function StyleA() 
'首页 上一页 下一页 尾页 本页为第1/20页,共20页,每页10条,文章总数200条 
'//分页样例:[首页] [上页] [下页] [尾页] [页次:4/5页] [共86篇 20篇/页] 转到:_ 页 
'//标签:{N1} {N2} {N3} {N4} || 共:{N8}条记录 {N6}页 当前为第{N5}页 每页{N7}条 
If IsEmpty(TempStr) Then 
ErrInfo=ErrInfo&"模板为空..." 
StyleB=ErrInfo 
Exit Function 
End If 
Dim M 
If TotalPage>1 Then 
If CurrPage>1 Then 
M="<a href='"&UrlStr&"Page=1'>"&"首页"&"</a>" 
TempStr=Replace(TempStr,"{N1}",M) 
M="<a href='"&UrlStr&"Page="&CurrPage-1&"'>"&"上一页"&"</a>" 
TempStr=Replace(TempStr,"{N2}",M) 
If CurrPage<TotalPage Then 
M="<a href='"&UrlStr&"Page="&CurrPage+1&"'>"&"下一页"&"</a>" 
TempStr=Replace(TempStr,"{N3}",M) 
M="<a href='"&UrlStr&"Page="&TotalPage&"'>"&"尾页"&"</a>" 
TempStr=Replace(TempStr,"{N4}",M) 
Else 
TempStr=Replace(TempStr,"{N3}","下一页") 
TempStr=Replace(TempStr,"{N4}","尾页") 
End If 
Else 
TempStr=Replace(TempStr,"{N1}","首页") 
TempStr=Replace(TempStr,"{N2}","上一页") 
M="<a href='"&UrlStr&"Page="&CurrPage+1&"'>"&"下一页"&"</a>" 
TempStr=Replace(TempStr,"{N3}",M) 
M="<a href='"&UrlStr&"Page="&TotalPage&"'>"&"尾页"&"</a>" 
TempStr=Replace(TempStr,"{N4}",M) 
End If 
Else 
TempStr=Replace(TempStr,"{N1}","首页") 
TempStr=Replace(TempStr,"{N2}","上一页") 
TempStr=Replace(TempStr,"{N3}","下一页") 
TempStr=Replace(TempStr,"{N4}","尾页") 
End If 
T=TempStr 
T=Replace(T,"{N8}",TotalRecord) 
T=Replace(T,"{N6}",TotalPage) 
T=Replace(T,"{N5}",CurrPage) 
T=Replace(T,"{N7}",PageN) 
TempStr=T 
StyleA=TempStr 
End Function 
Private Function StyleB() 
'首页 |< 1 2 3 4 5 6 7 >| 尾页 
'//标签:{N1} {N2} {L}{N}{L/}{N3}{N4} 
If IsEmpty(TempStr) Then 
ErrInfo=ErrInfo&"模板为空..." 
StyleB=ErrInfo 
Exit Function 
End If 
Dim ForceNum,BackNum'//当前页的前面和后面显示个数 
ForceNum=5 
BackNum=4 
Dim M 
'//首页 
M="<a href='"&UrlStr&"Page=1'>"&TempB(1)&"</a>" 
TempStr=Replace(TempStr,"{N1}",M) 
'//尾页 
M="<a href='"&UrlStr&"Page="&TempB(6)&"'>"&TempB(4)&"</a>" 
TempStr=Replace(TempStr,"{N4}",M) 
'//前一页 
M="|<" 
If CurrPage-1>=1 Then 
M="<a href='"&UrlStr&"Page="&CurrPage-1&"'>"&"|<"&"</a>" 
End If 
TempStr=Replace(TempStr,"{N2}",M) 
'//后一页 
M=">|" 
If CurrPage+1<=TotalPage Then 
M="<a href='"&UrlStr&"Page="&CurrPage+1&"'>"&">|"&"</a>" 
End If 
TempStr=Replace(TempStr,"{N3}",M) 
'//取出循环标签 
Dim N1,N2,N3,N4,N5,N6 
If InStr(TempStr,"{L}")>0 Then 
N1=InStr(TempStr,"{L}") 
End If 
If InStr(TempStr,"{L/}")>0 Then 
N2=InStr(TempStr,"{L/}") 
End If 
If N2<=N1 Then 
ErrInfo=ErrInfo&"循环标签出错..." 
StyleB=ErrInfo 
Exit Function 
End If 
N3=Mid(TempStr,N1,N2-N1+4)'//储存包括{L}{L/}循环标签的模板 
N4=Replace(N3,"{L}","")'//储存不包括{L}{L/}循环标签的模板 
N4=Replace(N4,"{L/}","") 
'//页码列表 
Dim FirstPageNum,LastPageNum 
If CurrPage-ForceNum<=1 Then 
FirstPageNum=1 
PageList="" 
Else 
FirstPageNum=CurrPage-ForceNum 
PageList="... ..." 
End If 
If CurrPage+BackNum>=TotalPage Then 
LastPageNum=TotalPage 
PageList_2="" 
Else 
LastPageNum=CurrPage+BackNum 
PageList_2="... ..." 
End If 
Dim I 
For I=FirstPageNum To LastPageNum 
If I=CurrPage Then 
N5=Replace(N4,"{N}","<b>"&I&"</b>") 
N6=N6&N5 
Else 
M="<a href='"&UrlStr&"Page="&I&"'>"&I&"</a>" 
N5=Replace(N4,"{N}",M) 
N6=N6&N5 
End If 
Next 
TempStr=Replace(TempStr,N3,N6) 
StyleB=TempStr 
End Function 
Private Function StyleC() 
'首页 |< |<< 1 2 3 4 5 6 7 >>| >| 尾页 
'//此风格在StyleB的基础上修改,增加两个标签:{N9}上10页 {N10}下10页 
'//标签:{N1}{N2}{N9}{L}{N}{L/}{N10}{N3}{N4} 
Dim T 
T=StyleB() 
'//前十页 
M="|<<" 
If CurrPage-10>=1 Then 
M="<a href='"&UrlStr&"Page="&CurrPage-10&"'>"&"|<<"&"</a>" 
End If 
T=Replace(T,"{N9}",M) 
M=">>|" 
If CurrPage+10<=TotalPage Then 
M="<a href='"&UrlStr&"Page="&CurrPage+10&"'>"&">>|"&"</a>" 
End If 
T=Replace(T,"{N10}",M) 
StyleC=T 
End Function 
Private Function StyleD() 
'//此风格在StyleC的基础上修改 
'//共{N8}条记录 {N6}页 当前为第{N5}页 每页{N7}条 
'//首页 |< |<< 1 2 3 4 5 6 7 >>| >| 尾页 
'//标签:{N1}{N2}{N9}{L}{N}{L/}{N10}{N3}{N4} 
Dim T 
T=StyleC() 
T=Replace(T,"{N8}",TotalRecord) 
T=Replace(T,"{N6}",TotalPage) 
T=Replace(T,"{N5}",CurrPage) 
T=Replace(T,"{N7}",PageN) 
StyleD=T 
End Function 
End Class 
%>