支持多风格自由变换的ASP分页类



  1
<%
  2Class Page
  3Private CurrPage
  4Private PageN
  5Private UrlStr
  6Private TempStr
  7Private ErrInfo
  8Private IsErr
  9Private TotalRecord
 10Private TotalPage
 11Public  PageRs
 12
 13Private TempA(11)
 14Private TempB(8)
 15'------------------------------------------------------------
 16Private Sub Class_Initialize()
 17      CurrPage=1'//默认显示当前页为第一页
 18      PageN=10'//默认每页显示10条数据
 19      UrlStr="#"
 20      TempStr=""
 21      ErrInfo="ErrInfo:"
 22      IsErr=False
 23End Sub
 24Private Sub Class_Terminate()
 25      If IsObject(PageRs) Then
 26            PageRs.Close
 27            Set PageRs=Nothing
 28      End If
 29      Erase TempA
 30      Erase TempB
 31End Sub
 32'----------------------------------------------------------
 33'//获取当前页码
 34Public Property Let CurrentPage(Val)
 35      CurrPage=Val 
 36End Property
 37Public Property Get CurrentPage()
 38      CurrentPage=CurrPage
 39End Property
 40'//获取每页显示条数
 41Public Property Let PageNum(Val)
 42      PageN=Val
 43End Property
 44Public Property Get PageNum()
 45      PageNum=PageN
 46End Property
 47'//获取URL
 48Public Property Let Url(Val)
 49      UrlStr=Val
 50End Property
 51Public Property Get Url()
 52      Url=UrlStr
 53End Property
 54'//获取模板
 55Public Property Let Temp(Val)
 56      TempStr=Val
 57End Property
 58Public Property Get Temp()
 59      Temp=TempStr
 60End Property
 61'------------------------------------------------------------
 62
 63Public Sub Exec(Sql,ConnObj)
 64      On Error Resume Next
 65      Set PageRs=Server.CreateObject("ADODB.RecordSet")
 66      PageRs.CursorLocation = 3 '使用客户端游标,可以使效率提高
 67      PageRs.PageSize = PageN '定义分页记录集每页显示记录数
 68      PageRs.Open Sql,ConnObj,0,1
 69      If Err.Number<>0 Then
 70        Err.Clear
 71     PageRs.Close
 72     Set PageRs=Nothing
 73        ErrInfo=ErrInfo&"建立或打开记录集错误"
 74     IsErr=True
 75     Response.Write ErrInfo
 76     Response.End
 77      End If
 78      TotalRecord=PageRs.RecordCount'//如果为0呢?
 79      If TotalRecord>=1 Then
 80      '----------------------------------------------------------------------------开始
 81      '//计算总页数,Ps,为什么不用PageRs.PageCount呢?
 82      'If TotalRecord Mod PageN=0 Then
 83        'TotalPage=PageRs.RecordCount\PageN
 84      'Else
 85        'TotalPage=PageRs.RecordCount\PageN
 86     'TotalPage=Abs(Int(TotalPage))
 87      'End If
 88   TotalPage=PageRs.PageCount
 89      '//处理当前接收页码,默认的为1,所以不是数字类型的都会为1
 90      If IsNumeric(CurrPage) Then
 91         CurrPage=CLNg(CurrPage)
 92         If CurrPage<1 Then CurrPage=1
 93      If CurrPage>TotalPage Then CurrPage=TotalPage
 94      Else
 95            '//Dim M:M="":IsNumeric(M)=True
 96         CurrPage=1
 97      End If
 98      '---------------------------------------------------------------------------结束
 99      Else
100         TotalPage=0
101         CurrPage=1
102      End If
103      '//
104      PageRs.AbsolutePage = CurrPage 'absolutepage:设置指针指向某页开头
105      PageRs.PageSize=PageN
106End Sub
107Private Sub Init()
108      'Private TempA(10)
109      TempA(1)="{N1}" '//首页
110      TempA(2)="{N2}"'//上一页
111      TempA(3)="{N3}"'//下一页
112      TempA(4)="{N4}"'//尾页
113      TempA(5)="{N5}"'//当前页码
114      TempA(6)="{N6}"'//页码总数
115      TempA(7)="{N7}"'//每页条数
116      TempA(8)="{N8}"'//文章总数
117      TempA(9)="{L}"'//循环标签开始
118      TempA(10)="{N}"'//循环内单标签:页码
119      TempA(11)="{L/}"'//循环标签结束
120      'Private TempB(8)
121      TempB(1)="首页"
122      TempB(2)="上一页"
123      TempB(3)="下一页"
124      TempB(4)="尾页"
125      TempB(5)=CurrPage'//当前页码
126      TempB(6)=TotalPage'//页码总数
127      TempB(7)=PageN'//每页条数
128      TempB(8)=TotalRecord'//文章总数
129End Sub
130Public Sub Show(Style)
131      If IsErr=True Then
132        Response.Write ErrInfo
133     Exit Sub
134      End If
135
136      Call Init()
137      Select Case Style
138      Case 1
139         Response.Write StyleA()
140      Case 2
141         Response.Write StyleB()
142      Case 3
143         Response.Write StyleC()
144      Case 4
145         Response.Write StyleD()
146      Case Else
147         ErrInfo=ErrInfo&"不存在当前样式"
148      Response.Write ErrInfo
149      End Select
150End Sub
151Public Function ShowStyle(Style)
152      If IsErr=True Then
153        ShowStyle=ErrInfo
154     Exit Function
155      End If
156
157      Call Init()
158      Select Case Style
159      Case 1
160         ShowStyle= StyleA()
161      Case 2
162         ShowStyle= StyleB()
163      Case Else
164         ErrInfo=ErrInfo&"不存在当前样式"
165  ShowStyle=ErrInfo
166      End Select
167End Function
168
169Private Function StyleA()
170'首页 上一页 下一页 尾页  本页为第1/20页,共20页,每页10条,文章总数200条
171'//分页样例:[首页] [上页] [下页] [尾页] [页次:4/5页] [共86篇 20篇/页] 转到:_ 页
172'//标签:{N1} {N2} {N3} {N4} || 共:{N8}条记录 {N6}页 当前为第{N5}页 每页{N7}条
173If IsEmpty(TempStr) Then
174      ErrInfo=ErrInfo&"模板为空"
175      StyleB=ErrInfo
176      Exit Function
177End If
178Dim M
179If TotalPage>1 Then
180      If CurrPage>1 Then
181        M="<a href='"&UrlStr&"Page=1'>"&"首页"&"</a>"
182     TempStr=Replace(TempStr,"{N1}",M)
183     M="<a href='"&UrlStr&"Page="&CurrPage-1&"'>"&"上一页"&"</a>"
184     TempStr=Replace(TempStr,"{N2}",M)
185     If CurrPage<TotalPage Then
186       M="<a href='"&UrlStr&"Page="&CurrPage+1&"'>"&"下一页"&"</a>"
187    TempStr=Replace(TempStr,"{N3}",M)
188    M="<a href='"&UrlStr&"Page="&TotalPage&"'>"&"尾页"&"</a>"
189          TempStr=Replace(TempStr,"{N4}",M)
190        Else
191       TempStr=Replace(TempStr,"{N3}","下一页")
192    TempStr=Replace(TempStr,"{N4}","尾页")
193     End If
194      Else
195        TempStr=Replace(TempStr,"{N1}","首页")
196     TempStr=Replace(TempStr,"{N2}","上一页")
197        M="<a href='"&UrlStr&"Page="&CurrPage+1&"'>"&"下一页"&"</a>"
198     TempStr=Replace(TempStr,"{N3}",M)
199     M="<a href='"&UrlStr&"Page="&TotalPage&"'>"&"尾页"&"</a>"
200        TempStr=Replace(TempStr,"{N4}",M)
201      End If
202Else
203      TempStr=Replace(TempStr,"{N1}","首页")
204      TempStr=Replace(TempStr,"{N2}","上一页")
205      TempStr=Replace(TempStr,"{N3}","下一页")
206      TempStr=Replace(TempStr,"{N4}","尾页")
207End If
208T=TempStr
209T=Replace(T,"{N8}",TotalRecord)
210T=Replace(T,"{N6}",TotalPage)
211T=Replace(T,"{N5}",CurrPage)
212T=Replace(T,"{N7}",PageN)
213TempStr=T
214StyleA=TempStr
215End Function
216
217Private Function StyleB()
218'首页 |< 1 2 3 4 5 6 7 >| 尾页
219'//标签:{N1} {N2} {L}{N}{L/}{N3}{N4}
220If IsEmpty(TempStr) Then
221      ErrInfo=ErrInfo&"模板为空"
222      StyleB=ErrInfo
223      Exit Function
224End If
225Dim ForceNum,BackNum'//当前页的前面和后面显示个数
226ForceNum=5
227BackNum=4
228Dim M
229'//首页
230M="<a href='"&UrlStr&"Page=1'>"&TempB(1)&"</a>"
231TempStr=Replace(TempStr,"{N1}",M)
232'//尾页
233M="<a href='"&UrlStr&"Page="&TempB(6)&"'>"&TempB(4)&"</a>"
234TempStr=Replace(TempStr,"{N4}",M)
235'//前一页
236M="|<"
237If CurrPage-1>=1 Then
238      M="<a href='"&UrlStr&"Page="&CurrPage-1&"'>"&"|<"&"</a>"
239End If
240TempStr=Replace(TempStr,"{N2}",M)
241'//后一页
242M=">|"
243If CurrPage+1<=TotalPage Then
244      M="<a href='"&UrlStr&"Page="&CurrPage+1&"'>"&">|"&"</a>"
245End If
246TempStr=Replace(TempStr,"{N3}",M)
247'//取出循环标签
248Dim N1,N2,N3,N4,N5,N6
249If InStr(TempStr,"{L}")>0 Then
250      N1=InStr(TempStr,"{L}")
251End If
252If InStr(TempStr,"{L/}")>0 Then
253      N2=InStr(TempStr,"{L/}")
254End If
255If N2<=N1 Then
256      ErrInfo=ErrInfo&"循环标签出错"
257      StyleB=ErrInfo
258      Exit Function
259End If
260N3=Mid(TempStr,N1,N2-N1+4)'//储存包括{L}{L/}循环标签的模板
261N4=Replace(N3,"{L}","")'//储存不包括{L}{L/}循环标签的模板
262N4=Replace(N4,"{L/}","")
263'//页码列表
264Dim FirstPageNum,LastPageNum
265If CurrPage-ForceNum<=1 Then
266   FirstPageNum=1
267   PageList=""
268Else
269   FirstPageNum=CurrPage-ForceNum
270   PageList=" "
271End If
272If CurrPage+BackNum>=TotalPage Then
273   LastPageNum=TotalPage
274   PageList_2=""
275Else
276   LastPageNum=CurrPage+BackNum
277   PageList_2=" "
278End If
279Dim I
280For I=FirstPageNum To LastPageNum
281      If I=CurrPage Then
282        N5=Replace(N4,"{N}","<b>"&I&"</b>")
283     N6=N6&N5
284      Else
285        M="<a href='"&UrlStr&"Page="&I&"'>"&I&"</a>"
286     N5=Replace(N4,"{N}",M)
287     N6=N6&N5
288      End If
289Next
290TempStr=Replace(TempStr,N3,N6)
291StyleB=TempStr
292End Function
293
294Private Function StyleC()
295'首页 |< |<< 1 2 3 4 5 6 7 >>| >| 尾页
296'//此风格在StyleB的基础上修改,增加两个标签:{N9}上10页 {N10}下10页
297'//标签:{N1}{N2}{N9}{L}{N}{L/}{N10}{N3}{N4}
298Dim T
299T=StyleB()
300'//前十页
301M="|<<"
302If CurrPage-10>=1 Then
303      M="<a href='"&UrlStr&"Page="&CurrPage-10&"'>"&"|<<"&"</a>"
304End If
305T=Replace(T,"{N9}",M)
306M=">>|"
307If CurrPage+10<=TotalPage Then
308      M="<a href='"&UrlStr&"Page="&CurrPage+10&"'>"&">>|"&"</a>"
309End If
310T=Replace(T,"{N10}",M)
311StyleC=T
312End Function
313
314Private Function StyleD()
315'//此风格在StyleC的基础上修改
316'//共{N8}条记录 {N6}页 当前为第{N5}页 每页{N7}条
317'//首页 |< |<< 1 2 3 4 5 6 7 >>| >| 尾页
318'//标签:{N1}{N2}{N9}{L}{N}{L/}{N10}{N3}{N4}
319Dim T
320T=StyleC()
321T=Replace(T,"{N8}",TotalRecord)
322T=Replace(T,"{N6}",TotalPage)
323T=Replace(T,"{N5}",CurrPage)
324T=Replace(T,"{N7}",PageN)
325StyleD=T
326End Function
327
328End Class
329%>
330
这个分页使用的是0游标,也就是Rs.Open Sql,Conn,0,1。但是感觉也快不了多少,10
万条数据的分页时间300多豪秒之间

Set test = New Page '创建啦
test.CurrentPage=1 '自己去读取拉,当前的页数
test.temp="{N1}{N2}{N3} {N4}"'这里是显示的模版,自己可以定义,至于标签,可以自己去那个类里找
test.Exec "Select * From [movie]",conn '这里执行sql语句,conn就是数据连接对象了
test.Show 1 '显示分页样式,可以根据用户输入的参数把这里的1换成变量

这个类可以扩展的地方很多,不错哦.
另外还有其他一些参数可以设置的.
posted @ 2006-11-20 09:55  MaxIE  阅读(494)  评论(1编辑  收藏  举报