C# 树次结构的数据
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# 树次结构的数据的更多相关文章
- 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限
大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...
- java树型结构的数据展现设计
在做一个需求管理的页面时,需求的展现是不限层级树型结构,需求下还可以分拆任务,页面要展现的字段有20多个,而且需求采用通用表单设计,db采用大宽表存储,有一百多个字段.目前数据量不大,第一版采用普通的 ...
- oracle存储过程删除树状结构的表数据
今天在删除一个车辆品牌表的时候,遇到了一个问题,是在java的代码中做逻辑删除还是直接在Oracle中一次删除完成呢 思来想去觉得还是在sql里直接删除比较合适, 为什么呢? 第一,涉及数据库的读写操 ...
- 根据租户id获取部门树状结构有父子结构的数据list
/** * 根据租户id获取部门树状结构 * @param tenantId * @return */ @GetMapping("getDeptTreeList") public ...
- 【转】B-树和B+树的应用:数据搜索和数据库索引
B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树: ⑵若根结点不是叶子 ...
- 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示
树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...
- 数据结构 B-树和B+树的应用:数据搜索和数据库索引
B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树:⑵若根结点不是叶子结点 ...
- 由简入繁实现Jquery树状结构
在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一些插件,也是可以实现这些效果的,比 ...
- 使用Map辅助拼装树状结构,消除递归调用
目前菜单或其他树状结构在数据库中的存储,多数是以一个parentid作为关联字段,以一维形式存储.使用时全部查询出来,然后在内存中拼装成树状结构.现在主要涉及的是拼装方法的问题. 一般可以进行 递归调 ...
随机推荐
- redis & macOS & python
redis & macOS & python how to install python 3 on mac os x? https://docs.python.org/3/using/ ...
- hdu 3622 二分+2-sat
/* 二分+2-sat 题意:在一个二维平面上给你n个炸弹,和2*n个位置,每一行的两个位置只能有一个放炸弹 现在炸弹爆炸有一个半径,当炸弹爆炸时两个炸弹的半径化成的圆不能相交,求最大半径 二分半径, ...
- bzoj3262 陌上花开 cdq+树状数组
[bzoj3262]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义 ...
- Spring Data JPA 之 一对一,一对多,多对多 关系映射
一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...
- 莫比乌斯反演套路一--令t=pd--BZOJ2820: YY的GCD
t<=10000组询问:有多少x,y,满足$x\epsilon [1,n],y\epsilon [1,m],(x,y)为质数$.n,m<=1e7. 首先式子列出来,f(i)--1<= ...
- SQL SERVER 2012 第三章 T-SQL 基本语句 group by 聚合函数
select Name,salesPersonID From Sales.store where name between 'g' and 'j' and salespersonID > 283 ...
- hdu_1028_Ignatius and the Princess III
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- tsdb import 相关
今天一直在做opentsdb 大量导入数据的工作. 中间遇到了一些值得记录的问题, 这里随手记一下 明天好好整理 1. 多进程logger python的logging模块不支持多进程,但我们可以用s ...
- Win7 文件加密存储操作后,如何在事后备份证书、秘钥
这个密钥的特点是只有在此系统下用此账户才可以修改,即便是你用此账户设置加密后删除此账户再重新建一个同名的账户依然无法修改.而且此密钥无法破解.所以一旦加密后,重装系统或者更换账户就无法修改了.唯一的办 ...
- UVa 340 Master-Mind Hints(猜数字游戏的提示)
题意 猜数字游戏 统计猜的数字有多少个数字位置正确 有多少个数字在答案中出现可是位置不对 每一个字符仅仅能匹配一次 直接匹配每位数 #include<cstdio> #includ ...