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作为关联字段,以一维形式存储.使用时全部查询出来,然后在内存中拼装成树状结构.现在主要涉及的是拼装方法的问题. 一般可以进行 递归调 ...
随机推荐
- CSUOJ 1542 线段树解决括号反向问题
题目大意: 根据初始给定的合法的小括号排序,每次进行一个操作,将第a位的括号反向,找到一个尽可能靠前的括号反向后是整个括号排列合法 数据量十分大,不断进行查询,要用线段树进行logn的复杂度的查询 首 ...
- [luoguP1033] 自由落体(模拟?)
传送门 这不能算是数论题... 卡精度这事noip也做的出来.. 代码 #include <cmath> #include <cstdio> int n, ans; doubl ...
- oracle将查询到的数据插入到数据库的表中
一.Oracle数据库中,把一张表的查询结果直接生成并导入一张新表中. 例如:现有只有A表,查询A表,并且把结果导入B表中.使用如下SQL语句: create table b as selec ...
- 【IntelliJ】IntelliJ IDEA常用设置及快捷键以及自定义Live templates
IntelliJ IDEA是一款非常优秀的JAVA编辑器,初学都可会对其中的一些做法感到很别扭,刚开始用的时候我也感到很不习惯,在参考了网上一些文章后在这里把我的一些经验写出来,希望初学者能快速适应它 ...
- Django的static和media
2013-09-09 18:13:57| 最近用到Django的静态文件,关于static和media,配置了很多次,终于可以用了. 首先是static,在'site/ ...
- SQL PATINDEX检索
语法格式:PATINDEX ( '%pattern%' , expression ) 返回pattern字符串在表达式expression里第一次出现的位置,起始值从1开始算. pattern字符串在 ...
- Check ini style config tool
INI style config is like below [section] # comment key = value Sometimes we want to check the config ...
- hibernate之多对一单向关联
一个工作组(Group)里能够有多个用户(User),一个User仅仅属于一个Group,这是典型的多对一的关系. 在多对一的关系中正确的数据库设计是在多的这方(在这里是User这方)加一个Group ...
- 【c++】【转】如何只在heap上创建对象,如何只在stack上建立对象?
http://www.cnblogs.com/chio/archive/2007/10/23/934335.html http://blog.csdn.net/szchtx/article/detai ...
- Python学习系列之异常处理
什么是异常处理 python内置了一套try···except···finally的错误处理机制 当程序出错的时候进行捕捉,然后根据捕捉到的错误信息进行响相应的处理 常用的内建异常 初识异常处理 如例 ...