asp.net(C#)版本,不通过递归,能不能像递归那样生成具有父子节点关系的树菜单?

xiaoyingxiaoniao 2008-11-17 08:47:21
asp.net(C#)版本,不通过递归,能不能像递归那样生成具有父子节点关系的树菜单?
本人目前的项目中,有不少地方是通过部门来选择对应人员.之前一直用递归来生成部门的TreeView.
但是最近老大有新的要求,由于递归效率很低,他希望能找到一种不通过递归也能动态生成树模型的方式,
请问可以吗?
...全文
207 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyingxiaoniao 2008-11-17
  • 打赏
  • 举报
回复
在Dephi里面的TreeView有个Item属性,通过它确实只要循环一次就能读出所有的子节点,
不论该TreeView有多少层.
但是在.net里面是没有这个属性的.麻烦啊!
criedshy 2008-11-17
  • 打赏
  • 举报
回复
OnTreeNodePopulate 你可以考虑TreeView的这个事件,是异步加载数据的,就是点了节点下一级节点才会出来
criedshy 2008-11-17
  • 打赏
  • 举报
回复
最好是一次性全部读出来 晕..
xiaoyingxiaoniao 2008-11-17
  • 打赏
  • 举报
回复
谢谢你的这种方式啊.
呵呵,不过我们的项目中不同的TreeView作用也不尽相同.
还有就是这种以div动态生成的方式目前我还需要一定时间去研究消化.
谢谢你.
xiaoyingxiaoniao 2008-11-17
  • 打赏
  • 举报
回复
呵呵,我也想递归实现了就一切ok了.
但是老大有这个要求啊.他说的毕竟有道理.递归的效率确实很低很低.
之前所有的树我都已经用递归实现了的.现在是希望能按他的要求改成非递归(最好是一次性全部读出来)
但是是动态地生成树.
criedshy 2008-11-17
  • 打赏
  • 举报
回复
不用递归怎么实现?

如果你的层次已经确定了,那你可以写死,但问题是你能保证你的层次是固定的吗
baby_cz 2008-11-17
  • 打赏
  • 举报
回复
实现不了
xiaoyingxiaoniao 2008-11-17
  • 打赏
  • 举报
回复
如果我自己的客户的话,我肯定不会要这一类型的软件.
因为当我进入某个页面的时候,我根本就不知道树菜单是什么样子,每次还要去点击才能发现下一级的内容.
一般来说,递归生成的树菜单都会默认展开一到两级,这样树的主干很明确,想查找某个子节点也比较方便.
不过还是谢谢你的回答.
ipqxiang 2008-11-17
  • 打赏
  • 举报
回复
可以尝试每次只展开一层结点,当点击结点时再加载该结点的下一层结点.
aigoo 2008-11-17
  • 打赏
  • 举报
回复
//flag=true 表示无兄弟 代码太长 贴不上去
aigoo 2008-11-17
  • 打赏
  • 举报
回复

//有兄弟是false;

public void GetTreeInformation(string username)
{
int i = 1;
da = new SqlDataAdapter("select * from MenuFunc123 order by ID", con);
da.Fill(TreeTable);
this.count = TreeTable.Tables[0].Rows.Count;

Response.Write( "<div class='stylediv'>");
Response.Write( "<img id=nolines0 src='minus_nolines.gif' width='18px' height='18px' onClick=ClickMenu('maindiv','nolines','0') align='absmiddle' />");
if (checkBox)
{
Response.Write("<input id='Checkbox0' onClick=SelectBox('maindiv',this) type='checkbox' />");
}
Response.Write( "<img id=open0 src='open.gif' width='16px' height='16px' align='absmiddle' />");
Response.Write( "<a onmousemove='ChangeColora(this)' onmouseleave='ChangeColorb(this)'><span class='stylespan' id='span_0' > 港华燃气</span></a></div>");
Response.Write("<div id='maindiv' belongCheckbox='Checkbox0' >"); //belongCheckbox='Checkbox0' 属于这个div 的checkbox

Response.Write( "<div class='stylediv'>");
Response.Write( "<img src='empty.gif' width='18px' height='18px' align='absmiddle' />");
for (int mm = depth; mm >0; mm--) //计算横向深度 添加竖线
{
Response.Write("<img src='line.gif' width='18px' height='18px' align='absmiddle' />");
}
Response.Write("<img id=plus" + i.ToString() + " src='" + plus + "' width='18px' height='18px' onClick=ClickMenu('div_" + i.ToString() + "','plus','" + i.ToString() + "') align='absmiddle' />");
if (checkBox)
{
Response.Write("<input id='Checkbox" + i.ToString() + "' onClick=SelectBox('div_" + i.ToString() + "',this) type='checkbox' />");
//---------checkbox 上嵌套两个div ,最上方的div 保存了 checkbox 的 id 就是(belongCheckbox)
}
Response.Write( "<img id=open" + i.ToString() + " src='open.gif' width='16px' height='16px' align='absmiddle' />");
Response.Write("<a onmousemove='ChangeColora(this)' onmouseleave='ChangeColorb(this)'>" + "<span class='stylespan' id='span_" + i.ToString() + "'> " + TreeTable.Tables[0].Rows[i]["FuncName"].ToString() + "</SPAN></a></div>");
Response.Write("<div id='div_" + i.ToString() + "' belongCheckbox='Checkbox" + i.ToString() + "' style='display: " + none + "'>");
this.depth++; //-----------------------------------第一级------------------------------

dep.Add(false);

CreatTrees(TreeTable.Tables[0].Rows[1]["ID"].ToString().Trim(), TreeTable.Tables[0].Rows[2]["ID"].ToString().Trim(), TreeTable.Tables[0].Rows[2]["FuncName"].ToString().Trim(), 2,false);
Response.Write( "</div>");
Response.Write( "</div>");
}
这个生成无限级树,可以参考下
xiaoyingxiaoniao 2008-11-17
  • 打赏
  • 举报
回复
你这种建表关系我知道,但是在asp.net(C#)版本中,添加节点的子节点的子节点需要用到类似nodes[0].ChildNodes[0].ChildNodes[0].......AddNodes(....)这样的格式,
也就是说,如果不绕过ChildNodes的话,是没办法实现非递归生成树菜单的
dingjian2008 2008-11-17
  • 打赏
  • 举报
回复
引用自(oec2003)

可以到表中加个字段

ID CategroyName parentsID Level

1 球类 0 0000
2 音乐 0 0001
3 手机 0 0002
4 篮球 1 00000000
5 足球 1 00000001
6 钢琴 2 00010000
6 小提琴 2 00010001

sql 语句

select
case when len([Level])=4 then
'--'+CategroyName
when len([level])=8 then
'----'+CategroyName
end
from test

order by [level]

62,073

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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