admin | |
|
|
等级: 城镇农民 贴子:54 积分:136 元:0 来自:88852网络 注册:2006-02-09 |
|
|
|
|
第 1 楼 |
|
[转帖]创建一个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的处理,可以自动的获取当前面的文件名,和所有带的参数,实现了页面转换页不丢失参数。 |
|
|
|
|