C#TreeView将所有可能的顺序节点附加为字符串

时间:2014-10-27 09:56:05

标签: c# algorithm recursion

我在从TreeView节点添加文本时遇到了困难,如图所示。

TreeView example structure

我正在尝试获得父节点的所有可能方式,并且其子节点附加如下:

  • a - > b - > c - > d
  • a - > b - > c - > ë
  • a - > b - > ˚F

我已经编写了这个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

你能告诉我一个解决方案吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

如果您只想要树中所有路径的字符串表示,则可以使用TreeNode.FullPath。如果您希望路径作为节点集合,则可以使用TreeNode.Tag而不是将字符串添加到存储在节点标记中的集合中。 running app

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);
}