归递的显示问题,马上结帖!!!!!!!!!!!!!!!!!!!!!

pentium8285 2003-09-29 01:48:16
表结构如下:
+-----------+-----------+-----------+-----------+----------+
  | 字段名 | 字段含义 | 字段类型 | 字段大小 | 字段属性 |
+-----------+-----------+-----------+-----------+----------+
| PowerID | 权限ID | Int | 4 | PK |
| PowerName | 权限名  | Varchar | 50 | Not Null |
| PowerInfo | 权限信息 | Varchar | 500 | |
| BelongID | 隶属ID | Int | 4 | |
+-----------+-----------+-----------+-----------+----------+

<%
'数据库连接
set conn=Server.CreateObject("ADODB.Connection")
conn.open "driver={SQL Server};server=chaiwei;DATABASE=chaiwei;UID=sa;PWD="

'打开所有父层数据
set rs=Server.CreateObject("ADODB.Recordset")
rs.Open "select * from powers where belongid is null order by powerid",conn,1,3


'列表主程序段
do while not rs.eof

'打印父层数据信息
Response.write "<option values='"&rs("PowerID")&"'>"&rs("PowerName")&"</option>"

'子程序调用,子层数据处理
Call ListSubPower(rs("powerid"))

rs.movenext

loop

'关闭父层数据集
rs.close
set rs=nothing

'调用过程--------------------------------------------------------------
Sub ListSubPower(id)

'打开隶属于上层 powerid 的所有子层数据信息
set rs_sub=Server.CreateObject("ADODB.Recordset")
rs_sub.Open "select * from powers where belongid=" & id & " order by powerid",conn,1,3

'列子层数据
do while not rs_sub.eof


'打印子层数据信息
Response.write "<option values='"&rs("PowerID")&"'>"&rs("PowerName")&"</option>"

'递归调用子程序本身,对子层数据进行逐渐处理
ListSubPower(rs_sub("powerid"))

rs_sub.movenext

loop

'关闭子层数据集
rs_sub.close
set rs_sub=nothing
End Sub


在select里如何显示结构为

部门1
部门1下属部门a
部门人员
部门1下属部门b
部门2

也就是说如何将输出的结果以树形显示!!
...全文
48 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
sx1123 2003-09-30
  • 打赏
  • 举报
回复
<% @Language=VBScript %>
<% Option Explicit %>

<%
dim arr
dim intLength
dim intI,intJ,intN
dim arrValue,arrID,arrParentID,arrIndex,arrDepth
dim arrTemp
dim Counter
counter=0
arrValue=""
arrParentID=""
arrID=""
intLength = 13
redim arr(intLength),arrValue(intLength),arrID(intLength),arrParentID(intLength),arrIndex(intLength),arrDepth(intLength)
'arr(0) = value,ID,ParentID
'可以根据需要从数据库取出
arr(0) = ",-1,0"
arr(1) = "中国,1,10"
arr(2) = "江苏,2,1"
arr(3) = "上海,3,1"
arr(4) = "昆山,8,5"
arr(5) = "苏州,5,2"
arr(6) = "南京,6,2"
arr(7) = "杭州,7,4"
arr(8) = "浙江,4,1"
arr(9) = "舟山,9,4"
arr(10)="地球,10,0"
arr(11)="美国,13,10"
arr(12)="北京,11,1"
arr(13)="玉山镇,12,8"
for intI = 1 To intLength
arrTemp=split(arr(intI),",")
arrValue(intI)=arrTemp(0)
arrID(intI)=arrTemp(1)
arrParentID(intI)=arrTemp(2)
Next
dim intIndex,intDepth
intIndex=1
intDepth=1
For intI=1 to intLength
If cint(arrParentID(intI))=0 Then
arrIndex(intI)=cstr(intIndex)
intIndex=intIndex+1
arrDepth(intI)=cstr(intDepth)
Call setIndex(arrID(intI),intDepth)
End If
Next

sub setIndex(ID,Depth)
dim intJ
Dim Depth1
Depth1=Depth+1
for intJ=1 to intLength
If cint(arrParentID(intJ))=cint(ID) Then
arrIndex(intJ)=cstr(intIndex)
intIndex=intIndex+1
arrDepth(intJ)=cstr(Depth1)
call setIndex(arrID(intJ),Depth1)
End If
Next
End sub

dim Value,ID,ParentID,Depth
redim Value(intLength),ID(intLength),ParentID(intLength),Depth(intLength)

for intI=1 to intLength
for intJ=1 to intlength
if intI=cint(arrIndex(intJ)) Then
Value(intI)=""
for intN=2 to cint(arrDepth(intJ))
Value(intI)=Value(intI)&"<img src='line.gif'>"
Next
Value(intI)=Value(intI)&"<img src='midblk.gif'><img src='leaf.gif'>"&arrValue(intJ)
ID(intI) = arrID(intJ)
ParentID(intI)=arrParentID(intJ)
Depth(intI)=arrDepth(intJ)
Exit for
End If
Next
Next
%>
<HTML>
<HEAD>
<TITLE> Demo_Tree </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<link rel="stylesheet" href="style.css" type="text/css">
</HEAD>
<SCRIPT LANGUAGE="vbScript">
<!--
function show(ParentID,RowIndex)
dim intI
dim objRow
document.form1.Index.value=ParentID
if eval("document.form1.Flag"+cstr(RowIndex)).value="0" Then
call open(ParentID,RowIndex)
else
call close(ParentID,RowIndex)
end if
End function

sub open(ParentID,RowIndex)
for intI=1 to document.form1.length.value
if eval("document.form1.PID"+cstr(intI)).value=ParentID Then
set objRow = table1.rows(intI-1)
objRow.classname="show"
end if
Next
eval("document.form1.Flag"+cstr(RowIndex)).value="1"
end sub


sub close(ParentID,RowIndex)
dim intI
dim objRow
dim ID
for intI=1 to document.form1.length.value
if eval("document.form1.PID"+cstr(intI)).value=ParentID Then
set objRow = table1.rows(intI-1)
objRow.classname="unshow"
ID= eval("document.form1.ID"+cstr(intI)).value
call close(ID,RowIndex)
end if
Next
eval("document.form1.Flag"+cstr(RowIndex)).value="0"
End sub

function open_all()
dim intI
dim ID
for intI=1 to cint(document.form1.length.value)
ID= eval("document.form1.ID"+cstr(intI)).value
call open(ID,intI)
next
end function

function close_all()
dim intI
dim ID
for intI=1 to cint(document.form1.length.value)'
ID= eval("document.form1.ID"+cstr(intI)).value
call close(ID,intI)
next
end function
//-->
</SCRIPT>
<body oncontextmenu="JavaScrip:return false">
<form name="form1" id="form1">
<input type="button" name="openall" value=" + " class="button" onclick="vbscript:open_all()">
<input type="button" name="closeall" value=" - " class="button" onclick="vbscript:close_all()">
<table id="table1" border="0" cellspacing="0" cellpadding="0">
<%
for intI=1 to intLength
%>
<tr
<%
If cint(Depth(intI)) = 1 Then
Response.write "class='show'"
Else
Response.write "class='unshow'"
End If
%>

>
<td>
<div onmouseover="style.cursor='hand'" onclick="vbscript:show '<%=ID(intI)%>','<%=intI%>'">
<%=Value(intI)%> (ID=<%=ID(intI)%>)
</div>
<!--<input type=button name="showNext" class="button" value="+" onclick="vbscript:show '<%=ID(intI)%>','<%=intI%>'">-->
<input type="hidden" name="ID<%=intI%>" value="<%=ID(intI)%>">
<input type="hidden" name="PID<%=intI%>" value="<%=ParentID(intI)%>">
<input type="hidden" name="Flag<%=intI%>" value="0">

</td>
</tr>
<%
next
%>
</table>
<input type="hidden" name="length" value="<%=intLength%>">
<input type="" name="Index" value="">
</form>
</BODY>
</HTML>
happydayandday 2003-09-30
  • 打赏
  • 举报
回复
up一下,select实现的分层显示
pentium8285 2003-09-29
  • 打赏
  • 举报
回复
谢谢大家的帮助,问题解决了,我自己也想出来了,最后和Brookes(边走边唱)的差不多
不过有两个错误

levelBlank=levelBlank * " "

应该是&的吧,还有Response.write "<option values='"& levelBlank & rs("PowerID")&"'>"&rs("PowerName")&"</option>"
应该放在option标签之间吧,放在value里不起作用啊:)
总之谢谢大家,csdn就是csdn,给分
avonqin 2003-09-29
  • 打赏
  • 举报
回复
就是咯,根据层的个数,动态设定 的个数嘛,这不难吧
lions911 2003-09-29
  • 打赏
  • 举报
回复
很简单,我刚做过一个,不过声明一下:版权归ASP版版主ZOROU所有!自己改一下数据库就行


<%
blanks="  "
function searchtree(sID)
set rst1=server.CreateObject("adodb.recordset")
SQL1="select * from tree where parentid="&sID
rst1.open SQL1,conn,2,3
while not rst1.eof
blanks=blanks+" "
Response.Write "<option>"&blanks&rst1("name")&"</option>"
searchtree(rst1("ID"))
rst1.movenext
wend
blanks="  "
rst1.close
set rst1=nothing
end function

dim conn
set conn=server.createobject("adodb.connection")'建立连接对象
conn.Open "DSN=tree;uid=sa;pwd="
set rst=server.CreateObject("adodb.recordset")
SQL="select * from tree where parentid = 0"
rst.Open SQL,conn,2,3
'set rst=conn.Execute("select * from [tree] where parentid = 0")
%>
<select name="sel1">
<%
while not rst.EOF
Response.Write "<option>"&rst("name")&"</option>"
searchtree(rst("ID"))
rst.movenext
wend
rst.Close
set rst=nothing
conn.Close
set conn=nothing
%>
</select>
avonqin 2003-09-29
  • 打赏
  • 举报
回复
|——部门1
|——下属1
|员工1
|员工2
|——下属2
|员工a
|员工b
|——部门2
|——下属1
|员工1
|员工2
|——下属2
|员工a
|员工b

你是要这种结构么?如果不是,你给我们你的树形图看看呀;如果是,那我那个程序就可以了呀
Brookes 2003-09-29
  • 打赏
  • 举报
回复
在每个程序加入层信息
<%
'数据库连接
set conn=Server.CreateObject("ADODB.Connection")
conn.open "driver={SQL Server};server=chaiwei;DATABASE=chaiwei;UID=sa;PWD="

'打开所有父层数据
set rs=Server.CreateObject("ADODB.Recordset")
rs.Open "select * from powers where belongid is null order by powerid",conn,1,3


'列表主程序段
do while not rs.eof

'打印父层数据信息
Response.write "<option values='"&rs("PowerID")&"'>"&rs("PowerName")&"</option>"

'子程序调用,子层数据处理
Call ListSubPower(rs("powerid"),1)

rs.movenext

loop

'关闭父层数据集
rs.close
set rs=nothing

'调用过程--------------------------------------------------------------
Sub ListSubPower(id,level)
levelBlank=""
for i=0 to level
levelBlank=levelBlank * " "
next
'打开隶属于上层 powerid 的所有子层数据信息
set rs_sub=Server.CreateObject("ADODB.Recordset")
rs_sub.Open "select * from powers where belongid=" & id & " order by powerid",conn,1,3

'列子层数据
do while not rs_sub.eof


'打印子层数据信息
Response.write "<option values='"& levelBlank & rs("PowerID")&"'>"&rs("PowerName")&"</option>"

'递归调用子程序本身,对子层数据进行逐渐处理
ListSubPower(rs_sub("powerid"),level+1)

rs_sub.movenext

loop

'关闭子层数据集
rs_sub.close
set rs_sub=nothing
End Sub
makay 2003-09-29
  • 打赏
  • 举报
回复
关注
pentium8285 2003-09-29
  • 打赏
  • 举报
回复
对啊,不是大家想的那么简单,输出的目录树是动态的,有n个层,问题是怎么实现n层的缩进》???
wangwm 2003-09-29
  • 打赏
  • 举报
回复
Response.write "<option values='"&rs("PowerID")&"'>  "&rs("PowerName")&"</option>"
关键是层树不同时如何控制> 的个数,


密切关注......
pentium8285 2003-09-29
  • 打赏
  • 举报
回复
拜托大家认真看看好吗?
pentium8285 2003-09-29
  • 打赏
  • 举报
回复
目录的层数是动态的,你怎么就知道只有两层,???
lovehwq21 2003-09-29
  • 打赏
  • 举报
回复
'打印子层数据信息
Response.write "<option values='"&rs("PowerID")&"'>"&rs("PowerName")&"</option>"
改为
'打印子层数据信息
Response.write "<option values='"&rs("PowerID")&"'>  "&rs("PowerName")&"</option>"
wangwm 2003-09-29
  • 打赏
  • 举报
回复
和我遇见了同样的问题
帮你顶
pentium8285 2003-09-29
  • 打赏
  • 举报
回复
倒,都没听明白吗?是在<option></option>里显示树形的结构!!!!
avonqin 2003-09-29
  • 打赏
  • 举报
回复
第一级:
Response.write "<option values='"&rs("PowerID")&"'>"&rs("PowerName")&"</option>"
第二级:
Response.write "<option values='"&rs("PowerID")&"'>  "&rs("PowerName")&"</option>"
第三级:
Response.write "<option values='"&rs("PowerID")&"'>    "&rs("PowerName")&"</option>"
angelheavens 2003-09-29
  • 打赏
  • 举报
回复
规定相邻两层之间有几个空格
lang11zi 2003-09-29
  • 打赏
  • 举报
回复
up
pentium8285 2003-09-29
  • 打赏
  • 举报
回复
我想是在<option></option>之间加空格
bananasmiling 2003-09-29
  • 打赏
  • 举报
回复
Response.write "<option values='"&rs_sub("PowerID")&"'>"&rs_sub("PowerName")&"</option>"
输出的结果以树形显示:你怎么显示?如何显示?
加载更多回复(1)

28,390

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧