C# 如何循环遍历具有相同类型列表的对象列表,并将每个对象添加到TreeView?
标题可能不是很清楚,但我会尝试在这里解释更多 我有以下课程C# 如何循环遍历具有相同类型列表的对象列表,并将每个对象添加到TreeView?,c#,winforms,loops,C#,Winforms,Loops,标题可能不是很清楚,但我会尝试在这里解释更多 我有以下课程 public class Node { public string Name { get; set; } = string.Empty; public List<Node> Children { get; set; } = new List<Node>(); public Node(string name, List<Node> children) {
public class Node
{
public string Name { get; set; } = string.Empty;
public List<Node> Children { get; set; } = new List<Node>();
public Node(string name, List<Node> children)
{
Name = name;
Children = children;
}
public Node() { }
}
等等
目前,我使用这种低效的,糟糕的,末日金字塔的方法
var rootNode = GetNodeFromString();
var rootTreeNode = TreeView1.Items.Add(new TreeNode(rootNode.Name));
foreach (var child0 in rootNode.Children)
{
var node1 = rootTreeNode.Items.Add(new TreeNode(child0.Name));
foreach (var child1 in node1.Children)
{
node1.Items.Add(new TreeNode(child1.Name));
// Repeat the code 30 more times...
}
}
有没有其他方法可以实现无限深度?(不是真正无限的,大约128层)通用解决方案 您可以创建如下所示的通用方法:
private TreeNode ConvertEntityToTreeNode<T>(
T entity,
Func<T, IEnumerable<T>> getChilds,
Func<T, TreeNode> createTreeNode)
{
TreeNode node = createTreeNode(entity);
var childs = getChilds(entity);
foreach (T child in childs)
node.Nodes.Add(ConvertEntityToTreeNode(child, getChilds, createTreeNode));
return node;
}
非通用解决方案
你自己已经找到了。这非常简单明了:
private TreeNode ConvertEntityToTreeNode(Node entity)
{
var node = new TreeNode(entity.Name);
foreach (var child in entity.Children)
node.Nodes.Add(ConvertEntityToTreeNode(child));
return node;
}
然后这样使用:
var treeNode = ConvertEntityToTreeNode(node, x => x.Children, x => new TreeNode(x.Name));
treeView1.Nodes.Add(treeNode);
var treeNode = ConvertEntityToTreeNode(node);
treeView1.Nodes.Add(treeNode);
为什么需要通用解决方案? 以防您有几个节点类和树。创建的算法总是一样的,您只需要知道:
TreeNode
那么这个算法总是一个递归算法,你可以在泛型方法中看到。我自己在11行中找到了一种方法来实现这一点
public static TreeNode ToTreeNode(Node root)
{
var treeNode = new TreeNode(root.Name);
foreach (var node in root.Children)
{
treeNode.Nodes.Add(ToTreeNode(node));
}
return treeNode;
}
您可以使用一种通用方法,它可以帮助您从
数据表或任何IEnumerable
填充树状视图。。。这个函数是什么?@RezaAghaei有没有一种方法可以修改这个函数以删除它,使它更自动化?请记住,我不是从数据库加载的。为什么您可能需要一个通用的解决方案?以防您有几个节点类和树。创建的算法总是一样的,您只需要知道1)根对象2)如何获取对象的子对象3)如何使用对象创建TreeNode
。那么这个算法总是一个递归算法,你可以在泛型方法中看到。
public static TreeNode ToTreeNode(Node root)
{
var treeNode = new TreeNode(root.Name);
foreach (var node in root.Children)
{
treeNode.Nodes.Add(ToTreeNode(node));
}
return treeNode;
}