一、新建了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. c# 字符串中全角和半角字符互转

    public class ConvertDBCAndSBC { /// <summary>半角转成全角 /// 半角空格32,全角空格12288 /// 其他字符半角33~126,其他字符 ...

  2. 如何将vim改造为python的IDE

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Jeffrey Wang PS:如有需要Python学习资料的小伙 ...

  3. Linux帮助——常用命令

    Linux帮助——常用命令 摘要:本文主要学习了Linux系统中常用的一些命令. uname命令 uname命令可以显示电脑以及操作系统的相关信息. 基本语法 uname [选项] 选项说明 -a:显 ...

  4. for与foreach区别

    首先说一下for循环: 格式:for( ; ; ){}; public static void main(String[] args) { List<String> arr = new A ...

  5. C++ const常量对象、常量成员函数和常引用

    01 常量对象 如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加const关键字 class CTest { public: void SetValue() {} private: int ...

  6. Javase之集合体系(3)之Set及其子类知识

    集合体系之Set及其子类知识 Set(接口) public interface Set<E>extends Collection<E> ​ 特点:无序(存储顺序与取出顺序不一致 ...

  7. 再来五道剑指offer题目

    再来五道剑指offer题目 6.旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4, ...

  8. 挑战常规 -- 为什么不要再用cookie作为储存?

    不要使用cookie当存储 Cookie 是什么? Cookie 由浏览器储存在本地,每次访问目标网址会带上的请求头,服务器可以通过Set-Cookie响应头设置Cookie. Cookie的用途 由 ...

  9. SpringBoot+Thyemelaf开发环境正常,打包jar发到服务器就报错Template might not exist or might not be accessible

    这里说一下Thyemelaf的巨坑 写了一个SpringBoot+Thyemelaf的项目,并不是前后端分离.今天想放到linux服务器上玩玩,打成jar包,然后一运行他妈居然报错了,报了一个Temp ...

  10. 『005』Web集群

    『006』索引-The Web cluster 准备更新中