现在的位置: 首页 > 综合 > 正文

可排序的分页类

2012年09月20日 ⁄ 综合 ⁄ 共 10498字 ⁄ 字号 评论关闭
把下面的代码COPY成两个文件再把SQL语句和连接串改了就可以了。。。。

演示地址:http://www.w2000.com.cn/sweet/class.asp

[CODE]<%
Option Explicit

''''''''''''''''''''''''''''''''''''''''''''
'属性
'countPage    总页数
'currentPage  当前页数
'Size         总长度
'fieldList    保存查询的列的集合
'orderByQuery 保存消除了orderby和desc和curp了的GET串
'con,rs,pagesize,。。。
'方法
'initObject   初始化成员
'page         显示页信息
''''''''''''''''''''''''''''''''''''''''''''

Class Cls_Kellynic_Page
    '私用成员
    Private countPage,currentPage,Size
    Private fieldList,orderByQuery,orderBy,desc
    '公共成员
    Public con,rs,pageSize
    
    '析构
    Private Sub Class_Terminate()
        On Error resume Next
        rs.Close
        Set rs        =    Nothing
        con.Close
        Set con        =    Nothing
        Err.Clear
    End Sub
    '构造
    Private Sub Class_Initialize()
        Set con        =    Server.CreateObject("ADODB.Connection")
        Set rs        =    Server.CreateObject("ADODB.RecordSet")
    End Sub
    '过滤不需要的GET串
    Private Function filterGET(ByVal filters)
        Dim url,i,obj,newGet,flag
        Set url        =    Request.QueryString()
        filters        =    Split(filters,",")        
        newGet        =    ""
        For Each obj In url
            flag    =    False
            For i=0 To UBound(filters)
                If Trim(LCase(CStr(obj)))=Trim(LCase(CStr(filters(i)))) Then
                    flag=True
                    Exit For
                End If
            Next
            If Not flag Then newGet    =    newGet    &    obj    &    "="    &    url(obj)    &    "&"
        Next
        If Not newGet="" Then newGet=Trim(Left(newGet,Len(newGet)-1))
        filterGET=newGet
    End Function
    '我的一个过滤函数,过滤掉不为数字的字符
    Function kingFilter(ByVal s)

        Dim regex
        Set regex=New RegExp
        regex.IgnoreCase=True
        regex.Global=True        
        regex.Pattern="[^\d]"
        s=regex.Replace(s,"")
        Set regex=Nothing
        If s="" Then s=0
        kingFilter=s
    End Function
    '初始化成员对象
    Public Function initObject(ByVal linkString,ByVal sql,ByVal defaultPageSize)
        On Error resume Next
        con.Open linkString
        If Err<>0 Then
            Err.Clear
            initObject    =    1
            Exit Function
        End If
        
        fieldList    =    Trim(Left(sql,InStr(sql," from ")-1))
        fieldList    =    Trim(Right(fieldList,Len(fieldList)-Len("select ")))
        
        Dim selectTemp,descTemp
        orderByQuery    =    filterGet("orderBy,desc,curp")
        If Not orderByQuery="" Then orderByQuery=orderByQuery & "&"
        
        orderBy        =    kingFilter(Request.QueryString("orderBy"))-1
        desc        =    Request.QueryString("desc")
        If desc="" Then desc=True
        desc        =    CBool(desc)
        
        selectTemp    =    Split(fieldList,",")
        If orderBy<0 Then
            orderBy    =    selectTemp(0)        
        elseif orderBy>Ubound(selectTemp) Then
            orderBy    =    selectTemp(Ubound(selectTemp))
        Else
            orderBy    =    selectTemp(orderBy)

        End If
        If desc Then
            descTemp="desc"
        Else
            descTemp=""
        End If
        sql            =    sql & " order by " & orderBy & " " & descTemp
        
        On Error resume Next
        rs.Open sql,con,3,3
        If Err<>0 Then
            Err.Clear
            initObject    =    2
            Exit Function
        Else
            initObject    =    0
        End If
        
        Size        =    CLng(con.Execute("select count(*) from (" & rs.Source & ")").fields(0))
        
        pageSize    =    kingFilter(Request.QueryString("pagesize"))
        If pageSize=0 Then
            pageSize    =    CLng(defaultPageSize)
        End If
        
        If Not Size Mod pageSize=0 Then
            countPage    =    Size\pageSize+1
        Else
            countPage    =    Size\pageSize
        End If
        
        currentPage    =    CLng(kingFilter(Request.Querystring("curp")))
        If currentPage=0 Then
            currentPage    =    1
        End If
        If currentPage>countPage Then
            currentPage    =    countPage
        End If
        
        If curp<>1 And Not rs.eof Then
            'rs.Move count_Elements*(curp-1)
            rs.AbsolutePosition=pageSize*(currentPage-1)
        End If
    End Function
    '显示上下页(当前页,总页数,前后加起来的页数,除去cp参数的GET串)
    Public Function page(ByVal showPageC)

          Dim i,l,starF,endF,reStr,getStr,queryStr
          queryStr        =    filterGET("curp")
        '*****************************************************
          If queryStr="" Then
                getStr="curp=1"
          Else
                getStr=queryStr & "&curp=1"
          End If
          If currentPage>1 Then
                reStr=reStr & "<a href=""?" & getStr & """ target=_self class=page>首页</a> "
          Else
                reStr=reStr & "<font color=#CCCCCC>首页</font> "
          End If
        '*****************************************************
          If queryStr="" Then
                getStr="curp=" & (currentPage-1)
          Else
                getStr=queryStr & "&curp=" & (currentPage-1)
          End If
          If currentPage>1 Then
                reStr=reStr & "<a href=""?" & getStr & """ target=_self class=page>上页</a> "
          Else
                reStr=reStr & "<font color=#CCCCCC>上页</font> "
          End If
        '*****************************************************
          If queryStr="" Then
                getStr="curp=" & (currentPage+1)
          Else
                getStr=queryStr & "&curp=" & (currentPage+1)
          End If
          If currentPage<countPage Then
                reStr=reStr & "<a href=""?" & getStr & """ target=_self class=page>下页</a> "

          Else
                reStr=reStr & "<font color=#CCCCCC>下页</font> "
          End If
        '*****************************************************
          If queryStr="" Then
                getStr="curp=" & countPage
          Else
                getStr=queryStr & "&curp=" & countPage
          End If
          If currentPage<countPage Then
                reStr=reStr & "<a href=""?" & getStr & """ target=_self class=page>末页</a> "
          Else
                reStr=reStr & "<font color=#CCCCCC>末页</font> "
          End If
        '*****************************************************
          If queryStr="" Then
                getStr="curp="
          Else
                getStr=queryStr & "&curp="
          End If
          reStr=reStr & "跳转:<input type=text value=" & currentPage & " size=4 onkeyup=""this.value=this.value.replace(/[^\d]/ig,'');if(this.value>" & countPage & ")this.value=" & countPage &";"" onblur=""this.onkeyup();"" onchange=""this.onkeyup();"" onkeydown=""if(event.keyCode==13)location.href='?" & getStr & "'+this.value;""> "
          reStr=reStr & "<span class=green> " & currentPage & "/" & countPage & " " & pageSize & "/页</span> 合计:" & Size & " "

          getStr=filterGET("pagesize")
          If getStr="" Then
                getStr="pagesize="
          Else
                getStr=getStr & "&pagesize="
          End If
          reStr=reStr & "页长:<input type=text value=" & pagesize & " size=4 onkeyup=""this.value=this.value.replace(/[^\d]/ig,'');"" onblur=""this.onkeyup();"" onchange=""this.onkeyup();"" onkeydown=""if(event.keyCode==13)location.href='?" & getStr & "'+this.value;"">" & "<br><br>"
        '*****************************************************
          Const DOT="<span style=cursor:hand;>..</span>"
          If showPageC=0 Then showPageC    =    5
          l=showPageC\2
          If currentPage-l<=1 Then
          starF=1
          Else
                starF=currentPage-l
                reStr=reStr & DOT
          End If
          endF=starF+showPageC
          For i=starF To endF
                If i>countPage Then Exit For
                If queryStr="" Then
                getStr="curp=" & i
                Else
                getStr=queryStr & "&curp=" & i
                End If
                If i<>currentPage Then
                reStr=reStr & "<a href=""?" & getStr & """ target=_self class=page>[" & i & "]</a> "
                Else
                reStr=reStr & "<b><font color=#CC9933>[" & i & "]</a></b> "

                End If
          Next
          If endF<countPage Then reStr=reStr & DOT
        '*****************************************************
          page=reStr
    End Function
    '构造order by地址
    Public Function getOrderBy(ByVal Index)
        getOrderBy    =    "?" & orderByQuery & "orderby=" & Index & "&desc=" & CStr(Not desc)
    End Function
End Class

%>%>

测试:

将以上的代码保存成 Cls_Kellyni_Page.asp

请看 class.asp 里的代码:

[CODE]<%@LANGUAGE="VBSCRIPT" CODEPAGE="936" CODEPAGE=%>
<!--#include file="Cls_Kellynic_Page.asp"-->
<%
Dim startimer,endtimer
startimer=timer()
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
<style type="text/css">
<!--
body,td,th
{
    font-size: 12px;
}
-->
</style>
</head>

<body>
<%
    Const LINK_STR="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data.mdb"
    Const OPEN_SQL="select 编号,标题,作者,点击次数,日期 from 技术文章表"
    '排序不支持 * 查询
    Dim kellynic_page,backValue
    Set kellynic_page=New Cls_Kellynic_Page
    backValue=kellynic_page.initObject(LINK_STR,OPEN_SQL,10)
    If backValue=0 Then
%>
<table width="100%"  border="0" cellspacing="0" cellpadding="0">
 <tr>
  <td bgcolor="#E1E1E1"><table width="100%"  border="0" cellspacing="1" cellpadding="6">
   <tr align="center" bgcolor="#F0F0F0">
    <td width="11%"><a href="<%=kellynic_page.getOrderBy(1)%>">编号</a></td>

    <td width="43%"><a href="<%=kellynic_page.getOrderBy(2)%>">标题</a></td>
    <td width="14%"><a href="<%=kellynic_page.getOrderBy(3)%>">作者</a></td>
    <td width="11%"><a href="<%=kellynic_page.getOrderBy(4)%>">点击次数</a></td>
    <td width="21%"><a href="<%=kellynic_page.getOrderBy(5)%>">日期</a></td>
   </tr>
<%
    Dim i
    For i=1 To kellynic_page.pageSize
        If kellynic_page.rs.eof Then Exit For
%>
   <tr bgcolor="#FFFFFF">
    <td><%=kellynic_page.rs.fields(0)%></td>
    <td><%=kellynic_page.rs.fields(1)%></td>
    <td><%=kellynic_page.rs.fields(2)%></td>
    <td><%=kellynic_page.rs.fields(3)%></td>
    <td><%=kellynic_page.rs.fields(4)%></td>
   </tr>
<%
        kellynic_page.rs.movenext()
    Next
%>
   <tr bgcolor="#FFFFFF">
    <td colspan="5"><%=kellynic_page.page(9)%></td>
    </tr>
  </table></td>
 </tr>
</table>
<%
    End If
    Set kellynic_page=Nothing
%>
</body>
</html>
<%
endtimer=timer()
%>
<%=Round((endtimer-startimer)*1000,3)%>%>

感觉这个类还行,只不过速度??
这个类可扩展性还是很强的,用来排序,不支持*查询

抱歉!评论已关闭.