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. 洛谷P1710地铁涨价

    题目背景 本题开O2优化,请注意常数 题目描述 博艾市除了有海底高铁连接中国大陆.台湾与日本,市区里也有很成熟的轨道交通系统.我们可以认为博艾地铁系统是一个无向连通图.博艾有N个地铁站,同时有M小段地 ...

  2. [NOIP2006] 提高组 洛谷P1064 金明的预算方案

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...

  3. 【BZOJ3925】地震后的幻想乡(期望概率DP,状压DP)

    题意:给定一张点数不超过10的无向连通图,每条边有一个[0,1]之间的随机权值,求最小生成树上最大边的期望值 提示:对于n个[0,1]之间的随机变量x1,x2,...,xn,第k小的那个的期望值是k/ ...

  4. Codeforces913F. Strongly Connected Tournament

    n<=2000个人参加比赛,这样比:(这里的序号没按题目的)1.两两比一场,比完连个图,边i->j表示i赢了j.2.连完那个图强联通分量缩起来,强连通分量内继续比,即强连通分量递归进行1. ...

  5. 解决MySQL中文乱码

    如果楼主用phpmyadmin的话,把库,表,字段的整理统一设置为utf8_unicode_ci. 然后取数据时务必SET NANES UTF8: 不是UTF-8!!切记!我以前就范过这个错误,也是显 ...

  6. ***jQuery使用总结(原创)

    Q: jquery选择器为变量时是怎么办 A: 一个变量我知道可以这样写:$("#"+id) Q: 如何清除单选框的checked属性 A: $("input[type= ...

  7. SQL SERVER 2012 第三章 T-SQL 基本SELECT语句用法,Where子句详细用法

    select [all|distinct] [top (<expression>) [Percent] [with ties]] <column list> [from < ...

  8. 洛谷 P1555 尴尬的数字

    P1555 尴尬的数字 题目背景 Bessie刚刚学会了不同进制数之间的转换,但是她总是犯错误,因为她的两个前蹄不能轻松的握住钢笔. 题目描述 每当Bessie将一个数转换成新的进制时,她总会写错一位 ...

  9. ios截屏事件监听

    目的:实现截屏反馈,类似支付宝的截屏上传反馈功能. 1.注册全局通知,在Appdelegate中注册截屏监听通知 - (void)registNotification{ [[NSNotificatio ...

  10. Java File类 mkdir 不能创建多层目录,如果是多层,可以调mkdirs

    public static void createDir(String destDirName) { File dir = new File(destDirName); if (!dir.exists ...