超酷的通用分页显示控制 (三) 显示类别表

发表于:2007-06-30来源:作者:点击数: 标签:
现在,我们可以更进一步,把类别表显示出来,让用户可以通过选择不同的类别来查看不同的内容。该怎样解决呢? 我们可以这样来考虑: 1、把类别的选择也看作一种查询 2、为了节省页面空间,把类别放在下拉列表框中,同时提供“所有类别”项,让用户可以浏览全
现在,我们可以更进一步,把类别表显示出来,让用户可以通过选择不同的类别来查看不同的内容。该怎样解决呢?

我们可以这样来考虑:
1、把类别的选择也看作一种查询
2、为了节省页面空间,把类别放在下拉列表框中,同时提供“所有类别”项,让用户可以浏览全部信息

因此,我们把类别放在 query.inc 中

另外,我们把 theScript 和 myconnstr 、thePageSize 都放入 function.inc 中,这样页面结构看起来更加合理。

注意 getScriptName() 函数,它从文件名取得 ASP 的名字,文件名后面的 add、delete、edit、view 作为系统的关键字,被过滤,例如:

    theActionScript = getScriptName("sample_edit.asp")
    theActionScript 值为 "sample"


这样我们可以对某个表的增删改操作用不同的文件来实现,例如:

    list_add.asp        添加记录
    list_delete.asp        删除
    list_edite.asp        修改
    list_view.asp        查看

在以后的篇章中,我们就会用到 theActionScript,您会发现有了它,很多功能都可以总结、合并。


请看 sample3.asp




<一> 需要分页的 ASP 文件

sample3.asp


<!--#include file="../inc/functions.inc"-->
<%
    ‘’//////////////////////////////////////////////////////////
    ‘’
    ‘’ 定义表名
    ‘’
    ‘’//////////////////////////////////////////////////////////

    theTableName= "addressbook"

    ‘’//////////////////////////////////////////////////////////
    ‘’
    ‘’ 查询条件
    ‘’
    ‘’//////////////////////////////////////////////////////////

    theQueryField    = "fld" & theTableName & "_nickname"‘’ 查询字段,完整名字
    theQueryTitle    = "昵称"                            ‘’ 字段显示标题
    theQueryTable    = "vw" & theTableName                ‘’ 字段所在的表,完整名字

    theQueryClass    = theTableName & "_class"            ‘’ 类别表名,去掉 tbl、vw 前缀
    theClassId        = c2int(request("classid"))            ‘’ 当前类别号

    ‘’ 如果是查询模式,则构造模糊查询语句
    if request("mode") = "query" then
        %><!--#include file="../inc/control/query_result.inc"--><%
    else
    ‘’ 否则忽略
        theQueryCon = "1>0"
    end if

    ‘’//////////////////////////////////////////////////////////
    ‘’
    ‘’ 限制条件
    ‘’
    ‘’//////////////////////////////////////////////////////////

    theLimitCon    = "fld" & theTableName & "_userid=" & Session("userid")

    if theClassId > 0 then
        theLimitCon = theLimitCon & " and fld" & theQueryClass & "id=" & theClassId
    end if

    ‘’//////////////////////////////////////////////////////////
    ‘’
    ‘’ 构造 SQL 语句
    ‘’
    ‘’//////////////////////////////////////////////////////////

    uSQL = "select * from " & theQueryTable & " where ( " & theQueryCon & " ) and ( " & theLimitCon & " ) "

%>
<!--#include file="../inc/control/navigator_init.inc"-->

<html>
<head>
<title>test</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link rel="stylesheet" href="../default.css" type="text/css">
</head>

                      <!-- 你的 HTML 代码//-->

                      <table width="100%" border="0" cellspacing="0" cellpadding="0">
                        <tr>
                          <td>
<!--查询控制-->
<!--#include file="../inc/control/query.inc"-->
                          </td>
                          <td>
<!--导航控制-->
<!--#include file="../inc/control/navigator.inc"-->
                          </td>
                        </tr>
                      </table>

                      <!-- 你的 HTML 代码//-->

                      <table width="100%" border="0" cellspacing="0" cellpadding="0">
                        <tr>
                          <td>
<!--显示本页记录-->

    <% For i = 1 To rs.pagesize %>
                      <!-- 你的记录显示代码//-->
    <%
        rs.MoveNext
        If rs.EOF Then
            Exit For
            rs.close
            conn.close
        End If
    next
    %>

                          </td>
                        </tr>
                      </table>

                      <!-- 你的 HTML 代码//-->

</body>
</html>



<二> 查询控制代码:

query.inc

注意 form 表单一定要有自己的名字,例如 form_query ,以和其他表单区分

<table width="100%" border="0" cellspacing="0" cellpadding="0" height="25">
<form method="post" action="<%=theScript%>?mode=query" name=form_query onsubmit="javascript:return checkquery(this);">
  <tr>
<%
if theQueryClass = "" then
    uTextSize = ""
    %>
    <td>
    <%
else
    ‘’显示类别列表
    uTextSize = "size=""8"""
%>
    <td width=120>
    类别
    <select class=form_select name="classid" onchange="javascript:this.form.submit();">
    <% ListClass theQueryClass, theClassId, 1 %>
    </select>
<% end if %>
    </td>
    <td>
    <%=theQueryTitle%>
    <input type="text" name="<%=theQueryField%>" value="<%=request(theQueryField)%>" class="form_text" <%=uTextSize%>>
    <input type="submit" name="form_query_submit" value="查询" class="form_button">
    </td>
  </tr>
</form>
</table>
    <script language="javascript">
    function checkquery(form)
    {
        if(form.<%=theQueryField%>.value==‘’‘’)
        {
            alert(‘’请输入<%=theQueryTitle%>信息。\n提示:输入 * 可以查询所有内容。‘’);
            form.<%=theQueryField%>.focus();
            return false;
        }
        return true;
    }
    </script>




<三> 构造模糊查询语句

query_result.inc

<%
    ‘’//////////////////////////////////////////////////////////
    ‘’
    ‘’ 构造模糊查询语句
    ‘’
    ‘’//////////////////////////////////////////////////////////

    ‘’ 模糊查询只支持字符串
    theQueryValue = trim(request(theQueryField))

    if theQueryValue = "*" or theQueryValue = "" then
        theQueryCon = "1>0"
    else
        theQueryCon = theQueryField & " like ‘’%" & theQueryValue & "%‘’ "
    end if

    ‘’ 如果有分类表,则需要加上分类限制
    if theQueryClass <> "" then
        if theClassId > 0 then
            theQueryCon = theQueryCon & " and fldclassid=" & theClassId
        end if
    end if
%>



<四> 函数集

function.inc

<%
‘’--------------------------------------------------------
‘’
‘’
‘’    初始化变量
‘’
‘’
‘’--------------------------------------------------------

‘’ 取得当前 ASP 页面的完整路径,重要技巧
theScript            = Request.ServerVariables("SCRIPT_NAME")

‘’从文件名取得 ASP 的名字
theActionScript        = getScriptName(theScript)

myconnstr            = "driver={SQL Server};server=yourserver;uid=sa;pwd=;database=yourdatabase"
thePageSize            = 20    ‘’ 每页显示的记录数
theLength_Listclass    = 8                                                ‘’ 类别列表中类别宽度

‘’--------------------------------------------------------
‘’Name:            C2int
‘’Argument:
‘’Return:
‘’Description:    转换为 Int 型
‘’--------------------------------------------------------

Function C2int(byval uStr)

    ‘’ 11, boolean
    if vartype(uStr) = 11 then
        if uStr = false then
            C2int = 0
        else
            C2int = 1
        end if
    else

        uStr = trim(uStr)

        if uSTr = "" then
            C2int = 0
        else
            C2int = Cint(uStr)
        end if

    end if

End Function

‘’--------------------------------------------------------
‘’Name:            ListClass
‘’Argument:        uTableClass        类别表名字
‘’                uSelClassId        当前选择的 Classid
‘’                uAllClass        是否显示“所有类别”:1 显示 / 0 显示一个空的选项
‘’Return:
‘’Description:    显示类别表
‘’--------------------------------------------------------

Sub listClass(uTableClass,uSelClassId,uAllClass)

    dim uListLength, uStr, uConn, uRs, uClassId, uClass_sel, uClassTitle, uSQL
    
    uClass_sel    = ""

    if uAllClass = 1 then
        if uSelClassId = 0 then
            uClass_sel = "selected"
        end if
        uStr = uStr & "      <option value=0 " & uClass_sel & ">所有类别</option>"
    else
        uStr = uStr & "      <option>" & string(theLength_Listclass/2 - 1," ") & "</option>"
    end if

    set uConn    = Server.Createobject("adodb.connection")
    uConn.open myconnstr
    
    set uRs = server.createobject("adodb.recordset")
    uSQL = "select * from tbl" & uTableClass & " order by fld" & uTableClass & "_title"
    uRs.open uSQL,uConn,1,3

    do while not uRs.eof
        uClass_sel    = ""
        uClassId    = uRs("fld" & uTableClass & "_id")
        uClassTitle    = leftX(uRs("fld" & uTableClass & "_title"),theLength_listClass)

        if uClassId = uSelClassId then
            uClass_sel = "selected"
        end if

        uStr = uStr & "<option value=""" & uClassId & """ " & uClass_sel & ">" & uClassTitle & "</option>"
        uRs.movenext
    loop

    response.write uStr

    rsClose uRs
    cnClose uconn

End Sub

‘’--------------------------------------------------------
‘’Name:            getScriptName
‘’Argument:
‘’Return:
‘’Description:   从文件名取得 ASP 的名字
‘’                文件名后面的 add、delete、edit、view 作为系统的关键字,被过滤,例如:
‘’                getScriptName("list_add.asp") 返回 "list" 。
‘’
‘’                这样我们可以对某个表的增删改操作用不同的文件来实现,例如:
‘’
‘’                list_add.asp        添加记录
‘’                list_delete.asp        删除
‘’                list_edite.asp        修改
‘’                list_view.asp        查看

‘’--------------------------------------------------------

Function getScriptName(byval str)
    dim uStr0,uStr1,uStr2,uMax,uTestStr,i,uKeyWords

    uKeyWords = "add,delete,edit,view"
    uKeyWords = split(uKeyWords,",")

    uStr0 = Split(str, ".")
    uStr1 = Split(uStr0(0), "/")
    uStr2 = Split(uStr1(ubound(uStr1)), "_")
    uMax = ubound(uStr2)
    uTestStr = uStr2(uMax)

    getScriptName = uStr2(0)

    for each element in uKeyWords
        if uTestStr = element then
            uMax = uMax - 1
            exit for
        end if
    next

    For i = 1 To uMax
        getScriptName = getScriptName + "_" + uStr2(i)
    Next

End Function

%>

原文转自:http://www.ltesting.net