代码之家  ›  专栏  ›  技术社区  ›  Christopher B. Adkins

TreeNodeCollection参考问题

  •  2
  • Christopher B. Adkins  · 技术社区  · 16 年前

    首先我们有万能的密码!

    List nodes = new List();
    TreeNode Temp = new TreeNode();
    
    TreeNodeCollection nodeList = treeViewTab4DirectoryTree.Nodes;
    
    while (nodeList.Count != 0)
    {
        Temp = nodeList[0];
    
        while (Temp.FirstNode != null)
        {
            Temp = Temp.FirstNode;
        }
    
        if (!nodes.Contains(Temp.FullPath))
        {
            nodes.Add(Temp.Text);
        }
    
        nodeList.Remove(Temp);
    }

    现在的问题是:我编写上述代码的目的是创建一个列表,其中包含树中所有节点的文本。这很管用。我遇到的问题是,当我从变量中删除节点时,它们也会从实际列表中删除。问题是如何复制节点列表,以便在不影响实际列表的情况下使用它们。我如何复制它而不只是引用它?任何帮助都将不胜感激!

    2 回复  |  直到 16 年前
        1
  •  3
  •   Rob    16 年前

    出现问题的原因是“nodeList”是对treeViewTab4DirectoryTree.Nodes的引用,而不是它的副本。

    复制 集合的内容,而不是对现有集合的引用。

    例如,如果您使用的是asp.net System.Web.UI.WebControls.TreeNodeCollection ,您可以按如下方式使用.CopyTo方法:

    TreeNode[] x = null;
    treeViewTab4DirectoryTree.Nodes.CopyTo(x, 0);
    
        2
  •  2
  •   Arne Sostack    16 年前

    更新以显示基于堆栈的方法:

    List<String> result = new List<String>();
    Stack<IEnumerator> nodeColls = new Stack<IEnumerator>();
    IEnumerator nodes = treeViewTab4DirectoryTree.Nodes.GetEnumerator();
    
    nodeColls.Push(null);
    
    while (nodes != null)
    {
        while (nodes.MoveNext())
        {
            result.add(nodes.Current.FullPath);
            if (nodes.Current.FirstNode != null)
            {
                nodeColls.Push(nodes);
                nodes = nodes.Current.Nodes.GetEnumerator();
            }
        }
    
        nodes = nodeColls.Pop();
    }
    

    下面的代码不像在注释中提到的那样工作,因为它不遍历整个树,而只获取每个顶级分支的第一个叶节点。

    原岗位,非工作代码

    首先,为什么需要从列表中删除这些项目?

    List<string> nodes = new List<string>();
    
    foreach (TreeNode tn in treeViewTab4DirectoryTree.Nodes)
    {
        TreeNode temp = tn;
    
        while (Temp.FirstNode != null)
        {
            Temp = Temp.FirstNode;
        }
    
        if (!nodes.Contains(Temp.FullPath))
        {
            nodes.Add(Temp.Text);
        }
    }
    

    要回答您的具体问题,假设Nodes集合实现IEnumerable,请使用:

    List<TreeNode> nodeList = new List<TreeNode>(treeViewTab4DirectoryTree.Nodes);
    

    TreeNode Temp = new TreeNode();
    

    到

    TreeNode Temp = null;