一、新建了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树形菜单--递归与非递归遍历生成树结构的集合的更多相关文章

  1. 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java

    前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...

  2. C实现二叉树(模块化集成,遍历的递归与非递归实现)

    C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue. ...

  3. 二叉树3种递归和非递归遍历(Java)

    import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...

  4. JAVA递归、非递归遍历二叉树(转)

    原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...

  5. 二叉树前中后/层次遍历的递归与非递归形式(c++)

    /* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...

  6. 数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

  7. java扫描文件夹下面的所有文件(递归与非递归实现)

    java中扫描指定文件夹下面的所有文件扫描一个文件夹下面的所有文件,因为文件夹的层数没有限制可能多达几十层几百层,通常会采用两种方式来遍历指定文件夹下面的所有文件.递归方式非递归方式(采用队列或者栈实 ...

  8. 回溯算法 DFS深度优先搜索 (递归与非递归实现)

    回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...

  9. C语言实现 二分查找数组中的Key值(递归和非递归)

    基本问题:使用二分查找的方式,对数组内的值进行匹配,如果成功,返回其下标,否则返回 -1.请使用递归和非递归两种方法说明. 非递归代码如下: #include <stdio.h> int ...

随机推荐

  1. numpy 和 tensorflow 中的各种乘法(点乘和矩阵乘)

    点乘和矩阵乘的区别: 1)点乘(即" * ") ---- 各个矩阵对应元素做乘法 若 w 为 m*1 的矩阵,x 为 m*n 的矩阵,那么通过点乘结果就会得到一个 m*n 的矩阵. ...

  2. php中搭建Web服务器和服务器配置

    1.搭建Web服务器     1.1目录结构 1.2访问服务器 访问规则:http://服务器ip地址/php页面 比如: http://localhost/demo.php http://127.0 ...

  3. PHP面试题2019年滴滴出行工程师面试题及答案解析

    一.单选题(共30题,每题5分) 1.下列关于PHP垃圾回收的说法,错误的是? A.开启/关闭垃圾回收机制可以通过修改php配置实现 B.可以在程序中使用gc_enable() 和 gc_disabl ...

  4. JQuery Easy UI 1.7官网最新版附1.7API

    最新的Easy UI 1.7包括1.7的API已上传至百度云盘,有需要的,请自行下载!!! 使用示例: 注:红色加粗的必须引入!!! <!DOCTYPE html> <html> ...

  5. .NET MVC5简介(二)

    MVCApplication---Application_Statr--RegisterRoutes--给RouteCollection添加规则,请求进到网站---X----请求地址被路由按照顺序匹配 ...

  6. 3.智能快递柜(通信篇-HTTP)

    1.智能快递柜(开篇) 2.智能快递柜(终端篇) 3.智能快递柜(通信篇-HTTP) 4.智能快递柜(通信篇-SOCKET) 5.智能快递柜(通信篇-Server程序) 6.智能快递柜(平台篇) 7. ...

  7. BayaiM__MySQL 常用函数

    BayaiM__MySQL 常用函数 原创 作者:bayaim 时间:2016-06-16 09:11:13 122 0删除编辑  MySQL 常用函数 阅读(883430) | 评论(44543) ...

  8. Web服务器—IIS

    https://blog.csdn.net/qq_33323054/article/details/81628627 https://jingyan.baidu.com/article/67508eb ...

  9. Pwnable-bof

    Download : http://pwnable.kr/bin/bof Download : http://pwnable.kr/bin/bof.c 下载之后,先看看c源码 #include < ...

  10. QQ第三方登录-python_web开发_django框架

    准备工作 1. 成为QQ互联的开发者 参考链接: <http://wiki.connect.qq.com/%E6%88%90%E4%B8%BA%E5%BC%80%E5%8F%91%E8%80%8 ...