【发布时间】:2016-12-27 09:01:32
【问题描述】:
我想将对象的结构映射到 TreeView。对象本身由Dictionary<string,object> 组成。我现在的问题是结构的深度没有一致性,因为每个object 都可以是另一个字典(或只是一个文本)。例如,这是一个对象的样子:
我知道我需要某种递归,但我不确定如何将其映射到树视图? 这是我当前的代码:
Dictionary<string, object> dict = (Dictionary<string, object>)e.Node.Tag; //dict is the object
foreach(KeyValuePair<string,object> kvp in dict)
{
if(kvp.Key != "icon" && kvp.Key != "typeLine")
{
}
}
非常感谢任何帮助!
编辑:有时 KeyValuePair 的对象不是另一个字典,而只是一个对象数组(我不知道为什么会这样)。至少在我看来,将这种奇怪的数据组合映射到树视图是不可能的。这是一张关于我的意思的图片:
Edit(2):好的,我想我终于可以使用 Matthys 的这个稍微修改过的函数了:
private TreeNode[] RecurseTree(Dictionary<string, object> dic)
{
List<TreeNode> branch = new List<TreeNode>();
foreach (KeyValuePair<string, object> kvp in dic)
{
TreeNode twig = new TreeNode(kvp.Key);
if (kvp.Value is string || kvp.Value is bool || kvp.Value is int)
{
twig.Nodes.Add(new TreeNode(kvp.Value.ToString()));
}
else if (kvp.Value is Dictionary<string, object>)
{
twig.Nodes.AddRange(RecurseTree((Dictionary<string, object>)kvp.Value));
}
else
{
IEnumerable enumerable = (kvp.Value as IEnumerable);
if (enumerable != null)
{
foreach (var item in enumerable)
{
if (item is string || item is bool || item is int)
{
twig.Nodes.Add(new TreeNode(item.ToString()));
}
else if (item is Dictionary<string, object>)
{
twig.Nodes.AddRange(RecurseTree((Dictionary<string, object>)item));
}
else
{
IEnumerable en = (item as IEnumerable);
foreach(var i in en)
twig.Nodes.Add(new TreeNode(i.ToString()));
}
}
}
}
branch.Add(twig);
}
return branch.ToArray();
}
【问题讨论】: