WPF树形菜单--递归与非递归遍历生成树结构的集合
一、新建了WPF项目作为测试,使用TreeView控件进行界面展示。
第一步创建实体类TreeEntity:
public class TreeEntity
{
private int _mid;
private string _title;
private int _pid;
private List<TreeEntity> _childrens=new List<TreeEntity>();
/// <summary>
/// 项ID
/// </summary>
public int Mid
{
get { return _mid; }
set
{
_mid = value;
}
}
/// <summary>
/// 项名称
/// </summary>
public string Title
{
get { return _title; }
set
{
_title = value;
}
}
/// <summary>
/// 父亲ID
/// </summary>
public int Pid
{
get { return _pid; }
set
{
_pid = value;
}
} /// <summary>
/// 儿子们
/// </summary>
public List<TreeEntity> Childrens
{
get { return _childrens; }
set
{
_childrens = value;
}
}
}
第二部构造无层级的数据源:
TreeEntity yeye = new TreeEntity()
{
Mid = ,
Title = "猪爷爷",
Pid =
};
TreeEntity laolao = new TreeEntity()
{
Mid = ,
Title = "猪姥姥",
Pid =
};
TreeEntity baba = new TreeEntity()
{
Mid = ,
Title = "猪爸爸",
Pid =
};
TreeEntity mama = new TreeEntity()
{
Mid = ,
Title = "猪妈妈",
Pid =
};
TreeEntity peiqi = new TreeEntity()
{
Mid = ,
Title = "佩奇",
Pid =
};
TreeEntity peizierzi = new TreeEntity()
{
Mid = ,
Title = "小佩佩奇",
Pid =
};
TreeEntity peiqisunzi = new TreeEntity()
{
Mid = ,
Title = "佩奇的孙子",
Pid =
};
TreeEntity peiqinver = new TreeEntity()
{
Mid = ,
Title = "小佩佩妞",
Pid =
};
TreeEntity qiaozhi = new TreeEntity()
{
Mid = ,
Title = "乔治",
Pid =
};
List<TreeEntity> treeEntities = new List<TreeEntity>()
{
yeye,
laolao,
mama,
peiqi,
peiqinver,
peiqisunzi,
qiaozhi,
peizierzi
};
第三步实现树形集合的构造
方法一:使用递归方法构造
1)、先取出顶级数据项--即无父亲的项
List<TreeEntity> rootLists = treeEntities.Where(x => x.Pid == ).ToList();
for (int i = ; i < rootLists.Count; i++)
{
rootLists[i].Childrens = CreateTree(rootLists[i].Mid, treeEntities);
}
2)、再遍历上一步取得的数据项,使用递归获取所有子项
private List<TreeEntity> CreateTree(int pid, List<TreeEntity> sources)
{
List<TreeEntity> childrens = new List<TreeEntity>();
if (sources != null && sources.Count > )
{
childrens = sources.Where(x => x.Pid == pid).ToList();
if (childrens != null & childrens.Count > )
{
foreach (var item in childrens)
{
item.Childrens = CreateTree(item.Mid, sources);
}
}
}
return childrens;
}
3)、将集合绑定给TreeView的数据源
MyTreeList.ItemsSource = rootLists;
方法二:非递归遍历
1)、将所有数据项装进字典中 字典中的键为 当前实例的ID;字典中的项为当前实例
Dictionary<int, TreeEntity> valuePairs = new Dictionary<int, TreeEntity>();
foreach (var item in treeEntities)
{
valuePairs[item.Mid] = item;
}
List<TreeEntity> rootLists =CreateTreeQuick(valuePairs);
2)、遍历字典中的所有Values,向当前项(item)的PID对应的实例中添加当前项(item)
private List<TreeEntity> CreateTreeQuick(Dictionary<int, TreeEntity> keyValues)
{
List<TreeEntity> myTree = new List<TreeEntity>();
foreach (var item in keyValues.Values)
{
if (item.Pid==)
{
myTree.Add(item);
}
else
{
if (keyValues.ContainsKey(item.Pid))
{
keyValues[item.Pid].Childrens.Add(item);
}
}
}
return myTree;
}
3)、将集合绑定到TreeView控件的数据源中
MyTreeList.ItemsSource = rootLists;
二、WPF前台布局
<TreeView x:Name="MyTreeList" Width="200">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:TreeEntity}" ItemsSource="{Binding Childrens}">
<TextBlock Text="{Binding Title}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
WPF树形菜单--递归与非递归遍历生成树结构的集合的更多相关文章
- 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...
- C实现二叉树(模块化集成,遍历的递归与非递归实现)
C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue. ...
- 二叉树3种递归和非递归遍历(Java)
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...
- JAVA递归、非递归遍历二叉树(转)
原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...
- 二叉树前中后/层次遍历的递归与非递归形式(c++)
/* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...
- 数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)
前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...
- java扫描文件夹下面的所有文件(递归与非递归实现)
java中扫描指定文件夹下面的所有文件扫描一个文件夹下面的所有文件,因为文件夹的层数没有限制可能多达几十层几百层,通常会采用两种方式来遍历指定文件夹下面的所有文件.递归方式非递归方式(采用队列或者栈实 ...
- 回溯算法 DFS深度优先搜索 (递归与非递归实现)
回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...
- C语言实现 二分查找数组中的Key值(递归和非递归)
基本问题:使用二分查找的方式,对数组内的值进行匹配,如果成功,返回其下标,否则返回 -1.请使用递归和非递归两种方法说明. 非递归代码如下: #include <stdio.h> int ...
随机推荐
- DevExpress的TreeList实现自定义右键菜单打开文件选择对话框
场景 DevExpress的TreeList实现节点上添加自定义右键菜单并实现删除节点功能: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
- Initialize a Property After Creating an Object创建对象后初始化属性 即如何设置对象的默认值(EF)
In this lesson, you will learn how to set the default value for a particular property of a business ...
- SAP MM 公司间STO发货单输出报错 - 合并工厂AUC1和存储位置6002没有货物收货地点 - 之对策
SAP MM 公司间STO发货单输出报错 - 合并工厂AUC1和存储位置6002没有货物收货地点 - 之对策 昨天收到客户业务部门报错,说是业务对交货单0080022298做POD失败.相关交货单的输 ...
- RSA 非对称加密算法的Java实现
关于RSA的介绍Google一下很多,这里不做说明.项目开发中一般会把公钥放在本地进行加密,服务端通过私钥进行解密.Android项目开发中要用到这个加密算法,总结后实现如下: import andr ...
- 彻底解决Python3写爬虫或网站时的乱码问题
第一次写贴子,试试水 很多玩Python3的都会遇到编码问题,如果直接去处理未知编码的网页,不是Python内部编码格式utf8会出现乱码,下面介绍一种将未知编码的字串转换为utf8来避免乱码的方法, ...
- python获得多个输入值
我们都知道python的input()函数是以字符串的形式输入的,这就产生了一个问题:当我们在一行内输入多个数值时,input()不会去判断输入元素个数,它只管把这行输入以字符串的形式输入,因此我们要 ...
- 在宿主机上执行docker容器内部的shell或程序
为了避免反复进入docker容器内部操作,可以将一系列容器内部的指令由宿主机来操作完成. 在宿主机(作者主机为windows7)上执行centos容器(name为centos-1)中/usr目录下的“ ...
- Html学习之十六(表格与表单学习--课程表制作)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- RFM模型的应用 - 电商客户细分(转)
RFM模型是网点衡量当前用户价值和客户潜在价值的重要工具和手段.RFM是Rencency(最近一次消费),Frequency(消费频率).Monetary(消费金额) 消费指的是客户在店铺消费最近一次 ...
- lua 5 流程控制 if
条件判断中,0 表示 true,只有 nil 才是 false if(0) then -- 可以没有括号 print("0 为 true") elseif 1 then print ...