//递归产生树
private void CreateTwo(TreeNode node, int id)
{
#region --根据指定ID查找数据到 dt
string strSql = "select * from Menu where MenuParent = " + id;
DataTable dt = SqlHelper.ExecuteDatatable(strSql);
#endregion if (id == ) // id = 0 是根节点
{
for (int i = ; i < dt.Rows.Count; i++) //先查询PID=0的
{
TreeNode nd = new TreeNode();
nd.Text = dt.Rows[i]["MenuName"].ToString();
CreateTwo(nd, Convert.ToInt32(dt.Rows[i]["MenuId"].ToString())); //把根节点ID传过去查找PID是该id的子节点
treeView1.Nodes.Add(nd);
}
}
else
{
for (int i = ; i < dt.Rows.Count; i++)
{
TreeNode Tnode = new TreeNode();
Tnode.Text = dt.Rows[i]["MenuName"].ToString();
CreateTwo(Tnode, Convert.ToInt32(dt.Rows[i]["MenuId"].ToString()));
node.Nodes.Add(Tnode);
}
}
}

非递归绑定3级别

        //绑定TrreView
private void InitModuleTree(DataTable dt)
{
//清空treeview上所有节点
this.treeView1.Nodes.Clear(); //先绑定父节点
for (int i = ; i < dt.Rows.Count; i++)
{
int Prent = Convert.ToInt16(dt.Rows[i]["MenuParent"]);//
if (Prent == ) //先绑定父节点
{
TreeNode nodeParent = new TreeNode();
nodeParent.Tag = dt.Rows[i]["MenuId"];//设置一个值,为加入子节点做准备,(先这样用,不管Tag是什么)
nodeParent.Text = dt.Rows[i]["MenuName"].ToString();
treeView1.Nodes.Add(nodeParent);
}
}
//在绑定子节点(绑定2级目录)
foreach (TreeNode item in treeView1.Nodes)
{
for (int i = ; i < dt.Rows.Count; i++)
{
var ss = dt.Rows[i]["MenuParent"]; //获取pid
var s1 = item.Tag;
if ((int)item.Tag == (int)dt.Rows[i]["MenuParent"]) //dt该行的pid = 这个父节点ID (表示属该行子节点)
{
TreeNode childNode = new TreeNode();
childNode.Tag = dt.Rows[i]["MenuId"];
childNode.Text = dt.Rows[i]["MenuName"].ToString();
item.Nodes.Add(childNode); //加入父节点中
}; }
}
//在绑定子节点(绑定3级目录)
foreach (TreeNode item1 in treeView1.Nodes)
{
int index0 = treeView1.Nodes.IndexOf(item1); //index 为索引值
var nodes1 = treeView1.Nodes[index0].Nodes; foreach (TreeNode item in nodes1)
{
for (int i = ; i < dt.Rows.Count; i++)
{
var ss = dt.Rows[i]["MenuParent"]; //获取pid
var s1 = item.Tag; if ((int)item.Tag == (int)dt.Rows[i]["MenuParent"]) //dt该行的pid = 这个父节点ID (表示属该行子节点)
{
TreeNode childNode = new TreeNode();
childNode.Tag = dt.Rows[i]["MenuId"];
childNode.Text = dt.Rows[i]["MenuName"].ToString();
item.Nodes.Add(childNode); //加入父节点中
}; }
}
} treeView1.ExpandAll(); //展开整棵树
}

C# 递归产生树的更多相关文章

  1. asp.net TreeView与XML配合使用v1.1

    刚我在做Tree view 绑定时自己摸索了一下,网上有人说TreeView绑定数据源,用什么递归绑定啥的,我不想看了,就自己试着写了一个 我是这样做的,如果有什么问题请大神指导,我是菜鸟额.. 1: ...

  2. POJ 2377 Bad Cowtractors (Kruskal)

    题意:给出一个图,求出其中的最大生成树= =如果无法产生树,输出-1. 思路:将边权降序再Kruskal,再检查一下是否只有一棵树即可,即根节点只有一个 #include <cstdio> ...

  3. 初学WebGL引擎-BabylonJS:第4篇-灯光动画与丛林场景

    前几章接触的案例都是接近静态的,由这张开始开始接触大量动态的内容,包括 球体灯光,变动的形体,以及一个虚拟的丛林场景 下章我会试着结合1-9案例的内容做出一个demo出来 [playground]-l ...

  4. 递归神经网络(Recursive Neural Network, RNN)

    信息往往还存在着诸如树结构.图结构等更复杂的结构.这就需要用到递归神经网络 (Recursive Neural Network, RNN),巧合的是递归神经网络的缩写和循环神经网络一样,也是RNN,递 ...

  5. 模块调用,datetime,time,logging,递归,双层装饰器, json,pickle迭代器和生成器

    一.python模块(导入,内置,自定义,开源) 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python ...

  6. 在Spring Bean实例过程中,如何使用反射和递归处理的Bean属性填充?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! <Spring 手撸专栏>目录 [x] 第 1 章:开篇介绍,我要带你撸 Spri ...

  7. .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]

    方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...

  8. 算法笔记_013:汉诺塔问题(Java递归法和非递归法)

    目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...

  9. Android 算法 关于递归和二分法的小算法

     // 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1. package demo; public class Mytest { public st ...

随机推荐

  1. 多叉树结构的数据,parent表示法转成children表示法

    最近碰到的问题,有个数组,数组元素是对象,该对象的结构就如树的parent表示法的节点一样.形象点讲就是该数组存放了树的所有“叶子节点”,并且叶子节点内存有父节点,一直到根节点为止,就如存了一条从叶子 ...

  2. SQL中IS NOT NULL与!=NULL的区别

    平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS ...

  3. Solr学习记录:Getting started

    目录 Solr学习记录:Getting started 1.Solr Tutorial 2. A Quick Overview Solr学习记录:Getting started 本教程使用环境:jav ...

  4. 一个asp+ACCESS省市二级联动菜单程序

    <%dim conndim connstron error resume nextconnstr="DBQ="+server.MapPath("test.mdb&q ...

  5. HDU 1515

    简单题,直接用STACK模拟整个过程. 模拟出栈时,应注意保护现场,等到递归完成后返回. #include <iostream> #include <string.h> #in ...

  6. C++编程-&gt;pair(对组)

    pair 是 一种模版类型.每一个pair 能够存储两个值.这两种值无限制,能够是tuple.vector ,string,struct等等. 首先来看一下pair的函数 初始化.复制等相关操作例如以 ...

  7. oracle 数据库开发面试题

    近期參加了数场面试,总结一下竞聘oracle 开发岗位最常问到哪些问题: 1.delete 与 truncate 差别? 1)truncate 是DDL语句.delete 是DML语句: 2)trun ...

  8. Java读源代码学设计模式:适配器Adapter

    适配器模式相关源代码:slf4j-1.6.1.hibernate-3.6.7 大家都知道.log4j是一个广泛使用的日志工具,除此之外.sun公司在JDK中也有自己的日志工具,也就是java.util ...

  9. c27---typedef

    // // main.c // typedef #include <stdio.h> /* typedef可以给一个已知的数据类型起别名. typedef 原有的数据类型 别名; 注意: ...

  10. [NOIP 2017] 奶酪

    [题目链接] http://uoj.ac/problem/332 [算法] 直接搜索即可 注意使用long long [代码] #include<bits/stdc++.h> using ...