我在从TreeView节点添加文本时遇到了困难,如图所示。
我正在尝试获得父节点的所有可能方式,并且其子节点附加如下:
我已经编写了这个C#代码,但它没有按照我的意愿正常工作,我有点坚持这个问题,所以这就是我要求你帮助的原因。
private static List<Node> GetChildNodes(Node node, List<Node> parentNodes)
{
List<Node> nodesNodes = new List<Node>();
nodesNodes.Add(node);
if(node.ChildNodes.Any())
{
foreach (var childnode in node.ChildNodes)
{
nodesNodes.AddRange(GetChildNodes(childnode, parentNodes));
}
}
return nodesNodes;
}
List<Node> appendedNodes = new List<Node>();
foreach(var node in parentNodes) // all my parent nodes from db (those with parentId = null)
{
var nodes = GetChildNodes(node, parentNodes);
string fullNode = String.Join(", ", nodes .OrderByDescending(n => n.ParentId).Select(n => n.Name));
appendedNodes.Add(new Node() { Id = nodes.OrderByDescending(l => l.ParentId).First().Id, Name = fullNode, ParentId = node.ParentId);
}
然后我通过显示属性名称(其形式为 - &gt; b - &gt; c ....)在UI中使用 attachedNodes
但是这会根据图片将此结果返回给我:a - &gt; b - &gt; c - &gt; d - &gt; e - &gt; ˚F
你能告诉我一个解决方案吗?提前谢谢!
答案 0 :(得分:0)
如果您只想要树中所有路径的字符串表示,则可以使用TreeNode.FullPath
。如果您希望路径作为节点集合,则可以使用TreeNode.Tag
而不是将字符串添加到存储在节点标记中的集合中。
public IEnumerable<string> GetTagPaths (TreeView tv) { return GetTagPaths(tv.Nodes[0]); }
public IEnumerable<string> GetFullPaths (TreeView tv){ return GetFullPaths(tv.Nodes[0]); }
public IEnumerable<string> GetTagPaths (TreeNode node)
{
if (node.Tag == null || String.IsNullOrEmpty(node.Tag as string))
node.Tag = node.Text;
foreach (TreeNode child in node.Nodes)
{
child.Tag = (node.Tag as string) + "->" + child.Text;
if (child.IsLeaf())
yield return (child.Tag as string);
else
foreach (string childPath in GetTagPaths(child))
yield return childPath;
}
}
public IEnumerable<string> GetFullPaths (TreeNode node)
{
if (node.IsLeaf())
yield return node.FullPath;
else
foreach (TreeNode child in node.Nodes)
{
foreach (string childPath in GetFullPaths(child))
yield return childPath;
}
}
和这个扩展方法
public static bool IsLeaf (this System.Windows.Forms.TreeNode tn)
{
System.Windows.Forms.TreeNodeCollection children = tn.Nodes;
return (children == null || children.Count == 0);
}