public static void CreateTree(TreeView tv)
{ ///获取层次结构的数据
Tree tree = new Tree();
DataSet ds = tree.GetCategorys();
if(ds == null || ds.Tables.Count <= 0 || ds.Tables[0].Rows.Count <= 0) return; tv.Nodes.Clear(); ///清空树的所有节点
///获取根节点的所有数据
DataRow[] rootRows = ds.Tables[0].Select("ParentID='0'");
if(rootRows.Length <= 0) return;
///创建根节点,并添加到TreeView控件中
TreeNode root = new TreeNode();
root.Text = rootRows[0]["Name"].ToString();
root.Value = rootRows[0]["ID"].ToString();
root.SelectAction = TreeNodeSelectAction.Expand;
tv.Nodes.Add(root);
///创建根节点的子节点
CreateSubNode(root,ds.Tables[0]);
} private static void CreateSubNode(TreeNode parentNode,DataTable dt)
{
if(parentNode == null || dt == null) return;
///获取当前节点的所有数据
DataRow[] rows = dt.Select("ParentID='" + parentNode.Value + "'","ShowOrder");
foreach(DataRow row in rows)
{ ///创建当前节点
TreeNode node = new TreeNode();
node.Text = row["Name"].ToString();
node.Value = row["ID"].ToString();
node.Expanded = false;
parentNode.ChildNodes.Add(node);
///递规创建当前节点(node)的子节点
CreateSubNode(node,dt);
}
}
首先Tree应该是一个自定义类, 
tree.GetCategorys(); 是返回创建这颗树的所有结点,具体怎么定义,怎么来,看用户自己是怎么定义的了 // 如果没有结点, 就没必要创建树了, 直接返回
if(ds == null || ds.Tables.Count <= 0 || ds.Tables[0].Rows.Count <= 0) return; // 这是要创建的树, 清空相当于进行初始化
tv.Nodes.Clear(); ///清空树的所有节点 ///获取根节点的所有数据 (ParentID='0'的为根结点, 刚才说了,所有结点都存放在ds.Tables[0]中)
DataRow[] rootRows = ds.Tables[0].Select("ParentID='0'"); //如果没有根结点, 就没必要继续了, 返回
if(rootRows.Length <= 0) return; //创建根节点,并添加到TreeView控件中
TreeNode root = new TreeNode(); // 这是一个结点对象,此将作为根结点
// 根结点的显示文本为第一行的Name字段
root.Text = rootRows[0]["Name"].ToString();
// 根结点的value值为第一行的ID字段
root.Value = rootRows[0]["ID"].ToString();
// 选中这个结点的动作----展开子结点
root.SelectAction = TreeNodeSelectAction.Expand;
// 将此结点加到树的第一层次中---因为直接加到树中,才决定了它是根结点
// 其它的子结点不是直接加到树中, 而是加入根结点中的(此种方法使用了组合
// 模式, 不明白的话,建议看看这种模式的说明
tv.Nodes.Add(root); //刚才说了, 子结点是加入到根结点的, 这样才能形成树,
//这个方法是创建子结点,所以参数中要传入根结点
private static void CreateSubNode(TreeNode parentNode,DataTable dt)
{
// 根结点为空,返回
if(parentNode == null || dt == null) return; ///获取当前节点的所有数据 , 根据根结点ID查询根结点下的子结点
DataRow[] rows = dt.Select("ParentID='" + parentNode.Value + "'","ShowOrder"); // 循环所有子结点, 一个一个加入到根结点
foreach(DataRow row in rows)
{
///创建当前节点 , 下面这些跟上面的相似, 不用再说明
TreeNode node = new TreeNode();
node.Text = row["Name"].ToString();
node.Value = row["ID"].ToString();
node.Expanded = false;
//将此子结点加入根结点
parentNode.ChildNodes.Add(node); ///递规创建当前节点(node)的子节点
// 此子结点有可能也有子结点, 所以也要为它添加子结点
// 此递归的结束条件是完成所有子结点的循环
CreateSubNode(node,dt);
} }

private static void CreateSubNode(TreeNode parentNode,DataTable dt)
{
foreach(DataRow row in rows) //结束条件控制
{
CreateSubNode(node,dt); //函数自己调用自己,这个是递归函数
}

}

C# 树次结构的数据的更多相关文章

  1. 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限

    大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...

  2. java树型结构的数据展现设计

    在做一个需求管理的页面时,需求的展现是不限层级树型结构,需求下还可以分拆任务,页面要展现的字段有20多个,而且需求采用通用表单设计,db采用大宽表存储,有一百多个字段.目前数据量不大,第一版采用普通的 ...

  3. oracle存储过程删除树状结构的表数据

    今天在删除一个车辆品牌表的时候,遇到了一个问题,是在java的代码中做逻辑删除还是直接在Oracle中一次删除完成呢 思来想去觉得还是在sql里直接删除比较合适, 为什么呢? 第一,涉及数据库的读写操 ...

  4. 根据租户id获取部门树状结构有父子结构的数据list

    /** * 根据租户id获取部门树状结构 * @param tenantId * @return */ @GetMapping("getDeptTreeList") public ...

  5. 【转】B-树和B+树的应用:数据搜索和数据库索引

    B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树: ⑵若根结点不是叶子 ...

  6. 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示

    树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...

  7. 数据结构 B-树和B+树的应用:数据搜索和数据库索引

    B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树:⑵若根结点不是叶子结点 ...

  8. 由简入繁实现Jquery树状结构

    在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一些插件,也是可以实现这些效果的,比 ...

  9. 使用Map辅助拼装树状结构,消除递归调用

    目前菜单或其他树状结构在数据库中的存储,多数是以一个parentid作为关联字段,以一维形式存储.使用时全部查询出来,然后在内存中拼装成树状结构.现在主要涉及的是拼装方法的问题. 一般可以进行 递归调 ...

随机推荐

  1. Codeforces Round #364 (Div. 2),只有A与B

    A. Cards time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  2. Linux下汇编语言学习笔记10 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  3. NOIP 2009 潜伏者

    P1071 潜伏者 题目描述 RR 国和 SS 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 SS 国的 RR 国间谍小 CC 终于摸清了 SS 国军用密码的编码规则: ...

  4. HAProxy+Redis实现负载负载均衡(待实践)

    为什么要使用HA,原因是可以聚合出一个VIP,也就是可以使用单一IP来访问下面多个Redis的实例. 首先说明一下,如果基于3.0以后搭建的官方原始Redis Cluster方案,使用HAProxy是 ...

  5. reactjs 视频教程

    近期玩了一下react,感觉挺不错的,搜了一下没有看到什么视频教程,于是自己便录制了几个入门视频.希望能够帮到大家.已经上传土豆了,能够点击以下的链接查看. http://www.tudou.com/ ...

  6. antd 的 Table 遇到的 bug

    1.报错情况 /* autoprefixer: off */ filter: progid\:DXImageTransform\.Microsoft\.Blur(PixelRadius\=1, Mak ...

  7. kvc VS kvo

    Kvo是Cocoa的一个重要机制,它主要是用于对一个属性的新旧值的监控. 例如说依据A(数 据类)的某个属性值变化,B(view类)中的某个属性做出对应变化.对于MVC,kvo应用的地方很广泛. 使用 ...

  8. WebForms UnobtrusiveValidationMode 须要“jquery”ScriptResourceMapping。

    一.问题产生的背景: 在敲牛腩新闻公布系统的后台登录页面的时候,我们用到了RequiredFieldValidator控件(验证非空控件),该控件的作用是禁止输入规定的内容,RequiredField ...

  9. Android开源项目SlidingMenu的学习笔记(一)

    SlidingMenu是眼下在应用程序上非常流行的一种UI技术.能够实现一种比較炫的滑动效果,SlidingMenu是Git上托管的一个项目,开源免费的.SlidingMenu作为一个Library的 ...

  10. 使用 FFmpeg 处理高质量 GIF 图片

    使用 FFmpeg 处理高质量 GIF 图片 - 为程序员服务  http://ju.outofmemory.cn/entry/169845