1

我不知道如何在树视图控件中显示所有数据:这是我的代码:

 private void PopulateTree(string path, int depth, TreeNode parent)
    {
        if (depth == 0)
        {
        //This make a child
            parent.Nodes.Add(new TreeNode(path);
            return;
        }
        //This makes a parent
        TreeNode first = new TreeNode(path);
        parent.Nodes.Add(first);

        foreach (var v in ListWithPaths)
        {
            PopulateTree(v, depth - 1, first);
        }
    }

它似乎只在depth=1

parent
-parent
--parent
---child
---child
--parent
---child
---child
-/parent
/parent

我是这样看的......

4

2 回答 2

0

您的代码中有一些不清楚的时刻:

  1. 您是否要明确限制路径深度(例如仅显示高达 3d 级别的路径)
  2. 什么是 ListWithPaths?两条路径可以有一个公共节点吗?

要显示具有限制(深度)的单个路径,代码可以是

private void PopulateTree(String path, TreeNode parent, int depth) {
  if (depth == 0) // <- Artificial criterium
    return;

  if (String.IsNullOrEmpty(path))
    return;

  int index = path.IndexOf(Path.DirectorySeparatorChar);

  String directoryName = (index < 0) ? path : path.Substring(0, index);
  String otherName = (index < 0) ? null : path.Substring(index + 1);

  TreeNode childNode = parent.Nodes.Add(directoryName);

  PopulateTree(otherName, childNode, depth - 1);
}

为了使用可能的公共节点加载没有任何限制的路径集合,您可以使用以下内容:

private void PopulateTree(String path, TreeView view, TreeNode parent) {
  if (String.IsNullOrEmpty(path))
    return;

  int index = path.IndexOf(Path.DirectorySeparatorChar);

  String directoryName = (index < 0) ? path : path.Substring(0, index);
  String otherName = (index < 0) ? null : path.Substring(index + 1);

  TreeNode childNode = null;
  TreeNodeCollection nodes = (parent == null) ? view.Nodes : parent.Nodes;

  foreach (TreeNode node in nodes)
    if (String.Equals(node.Name, directoryName)) {
      childNode = node;

      break;
    }

  if (childNode == null)
    childNode = nodes.Add(directoryName);

  PopulateTree(otherName, view, childNode);
}

private void PopulateTree(IEnumerable<String> paths, TreeView view) {
  view.BeginUpdate();

  try {
    foreach (String path in paths)
      PopulateTree(path, view, null);
  }
  finally {
    view.EndUpdate();
  }
}

...

PopulateTree(ListWithPaths, MyTreeView)
于 2013-06-27T17:51:16.227 回答
0

我从这里找到了这个答案:

private void Form1_Load(object sender, EventArgs e)
    {
        var paths = new List<string>
                        {
                            @"C:\WINDOWS\AppPatch\MUI\040C",
                            @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727",
                            @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MUI",
                            @"C:\WINDOWS\addins",
                            @"C:\WINDOWS\AppPatch",
                            @"C:\WINDOWS\AppPatch\MUI",
                            @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MUI\0409"
                        };

        treeView1.PathSeparator = @"\";

        PopulateTreeView(treeView1, paths, '\\');
}


private static void PopulateTreeView(TreeView treeView, IEnumerable<string> paths, char pathSeparator)
    {
        TreeNode lastNode = null;
        string subPathAgg;
        foreach (string path in paths)
        {
            subPathAgg = string.Empty;
            foreach (string subPath in path.Split(pathSeparator))
            {
                subPathAgg += subPath + pathSeparator;
                TreeNode[] nodes = treeView.Nodes.Find(subPathAgg, true);
                if (nodes.Length == 0)
                    if (lastNode == null)
                        lastNode = treeView.Nodes.Add(subPathAgg, subPath);
                    else
                        lastNode = lastNode.Nodes.Add(subPathAgg, subPath);
                else
                    lastNode = nodes[0];
            }
        }
    }

        foreach (var v in ListWithPaths)
        {
            PopulateTree(v, depth - 1, first);
        }
    }

基于路径,它正在创建深度。如果这不是所希望的行为,您可以PopulateTreeView相应地更改 -Function。

于 2013-06-27T17:46:53.987 回答