怎样使用双重循环输出树形菜单?

jiguanjie 2012-12-17 09:50:58
有图如下:


我想把表中的数据用树形菜单表示出来,Id代表当前节点,Pid代表的是它的父节点,用循环怎么做啊?求赐教~~~~~
...全文
315 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tigers12 2014-05-19
  • 打赏
  • 举报
回复
同楼主一样的问题求代码
jiguanjie 2012-12-18
  • 打赏
  • 举报
回复
引用 9 楼 hou306010849 的回复:
先循环父类,在嵌套循环子类!
求代码啊!!
Im_Sorry 2012-12-18
  • 打赏
  • 举报
回复
先循环父类,在嵌套循环子类!
rayaspnet 2012-12-18
  • 打赏
  • 举报
回复
引用 7 楼 jiguanjie 的回复:
引用 1 楼 rayaspnet 的回复:引用 楼主 jiguanjie 的回复:有图如下: 我想把表中的数据用树形菜单表示出来,Id代表当前节点,Pid代表的是它的父节点,用循环怎么做啊?求赐教~~~~~ 不知道双循环怎么遍历树。 通常递归是遍历树的做法 看代码 C# code?12345678printNode(Node node){ printT……
树的高度决定循环的层数。是动态的,所以要用递归
jiguanjie 2012-12-18
  • 打赏
  • 举报
回复
引用 1 楼 rayaspnet 的回复:
引用 楼主 jiguanjie 的回复:有图如下: 我想把表中的数据用树形菜单表示出来,Id代表当前节点,Pid代表的是它的父节点,用循环怎么做啊?求赐教~~~~~ 不知道双循环怎么遍历树。 通常递归是遍历树的做法 看代码 C# code?12345678printNode(Node node){ printTitle(node.title) for……
用递归我也做过,但现在我想在页面上直接用for循环给输出来,想了好久都没想到~
sjxwb 2012-12-18
  • 打赏
  • 举报
回复
Treeview1.Nodes.Clear() If dt.Rows.Count >= 1 Then For i As Integer = 0 To dt.Rows.Count - 1 Dim tn As New TreeNode tn.Text = "*" & dt.Rows(i).Item("unit") & "" 'tn.Value = dt.Rows(i).Item("id") 'tn.NavigateUrl = "admin_typemanage.aspx?id=" & dt.Rows(i).Item("id") & "&title=" & dt.Rows(i).Item("title") & "" 'tn.Target = "mainFrame" tn.Expanded = False Treeview1.Nodes.Add(tn) TreeviewAddchile(tn) Next End If Sub TreeviewAddchile(ByVal tn) 'Dim id As Integer = tn.Value Dim strunit As String = Replace(tn.text, "*", "") Dim dt As DataTable = GetDTb("SELECT unit,name from userinfo where mqzt=1 and unit=" & CS(strunit) & "order by name") If dt.Rows.Count >= 1 Then For i As Integer = 0 To dt.Rows.Count - 1 Dim ctn As New TreeNode ctn.Text = dt.Rows(i).Item("name") 'ctn.Value = dt.Rows(i).Item("id") 'ctn.NavigateUrl = "admin_typemanage.aspx?id=" & dt.Rows(i).Item("typeid") & "&title=" & dt.Rows(i).Item("type") & "" 'ctn.Target = "mainFrame" ctn.Expanded = False tn.childnodes.add(ctn) TreeviewAddchile(ctn) Next End If End Sub
  • 打赏
  • 举报
回复
如果你说的“双重循环”就是上述的“里边是foreach,外边是goto begin”的模式,那么实际上我觉得你应该看重的是这个思路。懂得思路就会觉得“没有什么技术含量,只不过是最基本的推理”,不懂得思路就会去追逐什么“循环语句”之类的纯粹技术的东西,就不会简化思维方式而是去死板地套用繁琐的八股公式。 顺便推荐你了解一下c#的“迭代器”机制。它可以让你不必把代码改的面目全非,你只要写出貌似递归的代码,于是c#编译器可以帮你自动化地改为迭代运行的!我非常欣赏c#编译器的这个伟大功能。
  • 打赏
  • 举报
回复
不过真正的应用程序编程中,我实际上不会去特意做这类优化。简单的递归程序运行的很好,没有必要变为迭代的。
  • 打赏
  • 举报
回复
我不知道你的所谓“双循环”是个什么概念,以下这个也许超出你的理解: 所谓“宽度优先方式”,我们可以在方法“printNode”的参数上设置一个“累积器”(List<Node>类型的列表),它承载那些需要扩展但是还没有扩展的节点。那么就可以写
void printNode(List<Node> container)
{
    if(container.Count>0)
    {
        var node= container[0];
        container.RemoveAt(0);
        foreach(var n in 查询某个节点的下一层子结点(node))
           container.Add(n);
        printNode(container);
    }
}
看代码比较繁琐,实际上一说就明白了:对于个待扩展的节点列表,我们从头部取出一个节点,然后把它的下一层子结点找出来,全都添加到这个列表的末尾等待以后再扩展,然后递归重复这个扩展过程! 这样就能宽度优先地处理所有结点了! 一眼验证这个程序是正确地,最后,我们把尾递归的那条代码改为代码 “goto begin;” 就成了循环了。
hujiasuta 2012-12-18
  • 打赏
  • 举报
回复
foreach (item in database) { treeView.Nodes.Add(database.ID) }
rayaspnet 2012-12-18
  • 打赏
  • 举报
回复
引用 楼主 jiguanjie 的回复:
有图如下: 我想把表中的数据用树形菜单表示出来,Id代表当前节点,Pid代表的是它的父节点,用循环怎么做啊?求赐教~~~~~
不知道双循环怎么遍历树。 通常递归是遍历树的做法 看代码

printNode(Node node)
{
  printTitle(node.title)
  foreach (Node child in node.children)
  {
    printNode(child); //<-- recursive
  }
}

62,053

社区成员

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

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

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

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