zoukankan      html  css  js  c++  java
  • 生成像资源管理器一样的树形目录

    树形目录显示程序
    问题描述:
    在我们项目中常常会出现自关联的数据表,如果我们从整体看去,整个表就呈现为一个树形数据结构(对于复杂的情况,它可能变成一个图)。当我们对这个表进行显示,编辑时,如果不采用好的表现形式,会显得很笨拙,为此,我们开发这样的树形结构的程序。在上一版本中,我们使用的是递归算法来实现,在我们对这个算法评测时发现,对于拥有成千上万条记录的数据库就不再能胜任了,所以在新的算法版本中,我们使用了XML技术,动态的发现数据,以解决一次从服务器下在大量数据的尴尬,同时也遍免了如果表数据结构呈现为图时就会进入死循环的错误。

    实际思路:
    1、 初始显示时只显示根与二级节点,根与二级节点同在一层次
    2、 点击一节点,如果它的子节点区域对象不存在,则建立对象,同时下载数据更新数据,显示所有子节点。
    3、 每个节点在建立后都就有相同的功能,如检查子节点是否存在,显示隐藏子节点等等
    4、 DHTML+XML+ASP+CSS同时使用
    技术难点:
    1、 使用xmlhttp接口时乱码问题:
    因为在asp输出页面中,缺省的编码方案并不是中文的,那么在客户端页面的xmlhttp中解释时,就会以缺省的方案解析,所以就会出现乱码。为此,我们在Server端的asp页面中,加入如下代码定义编码方案:
    Response.CharSet="GB2312"
    Response.ContentType="text/html"

    2、 如何在界面上保持上一版本的风格(类资源管理器形式):
    在上一版本中,所有的页面内容都是一气呵成的,在控制上采用递归等思想,所有时的界面相对友好,当时本版中的机制发生了变化,内容是有多次合成的
    关键问题,img ,span 对象的id 如何确定
    经过求证,在界面上,本版本的界面难以与第一界面相同,所以只能保留一部分,但是总体来说,新界面同样也能满足需要

    因为在这里不好使用附件,所以只能贴源码了:

    ---xtree.html-------------------------------------------------------------------

    <%<HTML> 
    <HEAD> 
    <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"
    <SCRIPT LANGUAGE=javascript src="xtree.js"
    </SCRIPT> 
    <style Type="text/css"
    <!-- 
    a:link { font-Size: 14px; text-decoration: none; color: #0000FF} 
    a:visited { font-Size: 14px; color: #0000FF; text-decoration: none} 
    a:hover { font-Size: 14px; color: #FF0000; background-color: #CCCC99; text-decoration: none} 
    a:active { font-Size: 14px; color: #FFFFFF; background-color: #191970; text-decoration: none} 
    .Item{ font-Size:14px} 
    --> 
    </style> 
    </HEAD> 
    <BODY leftMargin=0 rightMargin=0 topMargin=0 border=0> 
    <bold>树形菜单演示程序</bold><br> 
    <table border=0> 
    <tr><td nowrap> 
    <span id='oSpanroot' border=0></span><SCRIPT LANGUAGE=javascript>createChildNode("root",0);</SCRIPT></td></tr> 
    </table> 
    </BODY> 
    </HTML>
    %>


    -------xtree.asp---------------------------------------------------------------

    [code]<%@ Language=VBScript %>
    <% 
    Response.CharSet="GB2312" 
    Response.ContentType="text/html" 
    '''''''''''''''''''''''''''''''Server code start''''''''''''''''''''''''''''''' 
    Dim parId,nodeLayer 
    parid=Request.QueryString("parId"
    nodeLayer=Cint(Request.QueryString("nodeLayer")) 

    If(parid=""Then 
    Response.Write("root id can't is null"
    Response.End() 
    End If 
    If(nodeLayer<0) Then 
    nodeLayer=0 

    End If 
    %>
    <% 
    strconn="at" 
    strsql="select * from tree where par='"&parid&"'" 
    ''SQL 语句书写要求:在记录集的前面三个字段必须依次为:row_id(惟一的主键)、Name(菜单条显示的内容)、par_id(父节点row_id),其它根据需要输出与显示 
    Set conn=Server.Createobject("ADODB.connection"
    conn.Open strconn 

    Set rs=Server.Createobject("ADODB.Recordset"
    rs.Open strsql,conn,3,3 
    i=0 
    Dim row_id 
    row_id="" 
    While Not rs.EOF 
    row_id=rs.Fields("row_id").Value 
    Name=rs.Fields("name").Value 
    j=0 

    While j<nodeLayer 
    Response.Write("<img src='blank.bmp'>"
    j=j+1 
    Wend 
    Response.Write("<img id='objNode"&row_id&"' style='cursor:hand' src='open.bmp' onclick=javascript:createChildNode('"&row_id&"',"&nodeLayer+1&") border=0 align='absmiddle'>"
    %>
    <%Response.Write("<img src='blank.bmp' border=0 align='absmiddle'>"
    Response.Write("<a class=item href='view.asp?id="&row_id&"' target='mainFrame'>"&Trim(Name)&"</a></br>") '项目内容 
    Response.Write("<span id='oSpan"&row_id&"' ></span>") '子节点内容区域 
    i=i+1 
    rs.MoveNext 
    Wend 
    '''''''''''''''''''''''''''''''''''''''''Server Code END '''''''''''''''''''''''''''''''''' 
    %> %>

    ---------xtree.js-----------------------------------------------------------------------------

    <%Function getChildTree(parId,nodeLayer) 
    //parId:=夫节点id,nodeLayer:=子节点所属层次 

    var xmlhttp = New ActiveXObject ("Microsoft.XMLHTTP"); 
    xmlhttp.Open("get""xtree.asp?parId="+parId+"&nodeLayer="+nodeLayer, False); 
    xmlhttp.Send("Author:taojianbo;Version:2.0"); 
    Return xmlhttp.responseText; 


    Function showHide(objid) 
    //显示,隐藏区域,达到菜单显示的目的 
    //objid:=区域对象ID的parid部分 

    var temp; 
    Eval("temp=oSpan"+objid+".style.display"); 
    If(temp=="block"

    Eval("oSpan"+objid+".style.display='none'"); 
    Eval("objNode"+objid+".src='open.bmp'"); 

    Else 

    Eval("oSpan"+objid+".style.display='block'"); 
    Eval("objNode"+objid+".src='close.bmp'"); 

    }//End Function 

    Function createChildNode(childNodeId,nodeLayer) 
    //如果子节点内容为空,则初始化,并更新数据 
    //childNodeId:=子节点对象Id的parid部分 

    var temp; 
    Eval("temp=oSpan"+childNodeId+".innerHTML"); 
    If(temp==""

    Eval("oSpan"+childNodeId+".innerHTML='<div align=right>LOADING...</div><br>'"); 
    temp=New String(getChildTree(childNodeId,nodeLayer)); 
    If(temp.Length!=0) 

    Eval("oSpan"+childNodeId+".innerHTML=temp"); 
    %>
    <%Eval("objNode"+childNodeId+".src='close.bmp'");//变为减号 

    Else 
    {//如果temp内容为空,说明未找到子树,则该节点为叶节点,更改相关属性 
    Eval("objNode"+childNodeId+".src='leaf.bmp'");//更改图标 
    Eval("objNode"+childNodeId+".onclick=''"); //取消click事件 
    Eval("oSpan"+childNodeId+".innerHTML=temp");//内容为空 


    Else 
    { showHide(childNodeId); 

    }
    %>
  • 相关阅读:
    UVA
    UVA
    模板——扩展欧几里得算法(求ax+by=gcd的解)
    UVA
    模板——2.2 素数筛选和合数分解
    模板——素数筛选
    Educational Codeforces Round 46 (Rated for Div. 2)
    Educational Codeforces Round 46 (Rated for Div. 2) E. We Need More Bosses
    Educational Codeforces Round 46 (Rated for Div. 2) D. Yet Another Problem On a Subsequence
    Educational Codeforces Round 46 (Rated for Div. 2) C. Covered Points Count
  • 原文地址:https://www.cnblogs.com/studio313/p/358318.html
Copyright © 2011-2022 走看看