今天是:     
中文频道    International Channel
设为首页     加入收藏 
7 6 5 4 3
2 1 0
8 7 4 3 2 1
 
   论坛  → 站长交流区 → 『 技术交流区 』 → 浏览主题 - [转帖]创建一个ASP通用分页类
      『 技术交流区 』(浏览主题 - [转帖]创建一个ASP通用分页类) 版主: 还没呢   [精华]  [事件]  [管理]
 主题:[转帖]创建一个ASP通用分页类
向版主报告本贴   显示适合打印的页面   将本页推荐给我的好友   将本页加入收藏夹   刷新本页  
admin男,离线了
  
  等级:管理员 城镇农民
  贴子:54
  积分:136
  元:0
  来自:88852网络
  注册:2006-02-09
查看 admin 的详细信息 将 admin 加为我的好友 给 admin 发短信 给 admin 发邮件   编辑这个贴子 引用并回复这个贴子 回复这个贴子 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的处理,可以自动的获取当前面的文件名,和所有带的参数,实现了页面转换页不丢失参数。
 
没有最好,只有更好!
   2006-11-21 10:10
 admin 的IP是:221.225.172.5  操作系统: Windows 2000,浏览器: Internet Explorer 6.0 
本主题回复0贴,浏览332人次,分页: [1]
 → 快速回复:[转帖]创建一个ASP通用分页类
  您是否还没有 注册 或还没有 登陆 本站?!
中国商业发展中心主办 http://www.chinanbd.com  QQ:251366508
国家商业发展网