将所有TreeView的父节点和子节点复制到另一个TreeView中 c# WinForms

12
我正在尝试使用以下代码将树形视图的整个树(所有节点)完全复制到另一个树形视图中:
``` ```
        TreeNodeCollection myTreeNodeCollection = treeView1.Nodes;

        TreeNode[] myTreeNodeArray = new TreeNode[treeView1.Nodes.Count];

        treeView1.Nodes.CopyTo(myTreeNodeArray, 0);

        treeView2.Nodes.AddRange(myTreeNodeArray);

但是这不允许我这样做,它要求要么在源树视图中删除节点,要么使用它的克隆!我该怎么办?我不想在此过程中丢失我的源树视图中的任何内容。

**更新** 好的,伙计们,我找到了一段复杂的代码(对我来说!!),但我该如何使用它?

    public static T DeepTreeCopy<T>(T obj)
    {
        object result = null;
        using (var ms = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(ms, obj);
            ms.Position = 0;
            result = (T)formatter.Deserialize(ms); ms.Close();
        }
        return (T)result;
    } 

在第一段代码中,需要先从TreeView1的节点集合中删除节点,然后再将它们添加到其他集合中:foreach (TreeNode node in treeView1.Nodes) { treeView1.Nodes.Remove(node); }这比克隆更快且更干净。 - dmitry
我认为@jeffjohnson的Clone()答案应该被标记为被接受的答案。 - David Thielen
5个回答

13

试试这个

public void Copy(TreeView treeview1, TreeView treeview2)
{
    TreeNode newTn;
    foreach (TreeNode tn in treeview1.Nodes)
    {
        newTn = new TreeNode(tn.Text, tn.Value);
        CopyChilds(newTn, tn);
        treeview2.Nodes.Add(newTn);
    }
}

public void CopyChilds(TreeNode parent, TreeNode willCopied)
{
    TreeNode newTn;
    foreach (TreeNode tn in willCopied.ChildNodes)
    {
        newTn = new TreeNode(tn.Text, tn.Value);
        parent.ChildNodes.Add(newTn);
    }
} 

致以问候


谢谢,它有相同的问题(在复制之前应该删除节点或应该克隆)。 - Dumbo
你忘记在自身调用CopyChild()方法了! - Vahid Ghadiri
你可以使用Clone方法。它会克隆整个子树。 - surfasb

10
像MohD的答案一样,但使用递归获取所有节点。(子节点的节点)
    public void CopyTreeNodes(TreeView treeview1, TreeView treeview2)
    {
        TreeNode newTn;
        foreach (TreeNode tn in treeview1.Nodes)
        {
            newTn = new TreeNode(tn.Text, tn.ImageIndex, tn.SelectedImageIndex);
            CopyChildren(newTn, tn);
            treeview2.Nodes.Add(newTn);
        }
    }
    public void CopyChildren(TreeNode parent, TreeNode original)
    {
        TreeNode newTn;
        foreach (TreeNode tn in original.Nodes)
        {
            newTn = new TreeNode(tn.Text, tn.ImageIndex, tn.SelectedImageIndex);
            parent.Nodes.Add(newTn);
            CopyChildren(newTn, tn);
        }
    } 

如果您从TreeNode派生(也许不是最好的想法),克隆会变得有点复杂。 - dmitry

8
使用node.Clone()函数同样有效...
foreach (TreeNode node in treeViewSource.Nodes)
{
    treeViewTarget.Nodes.Add((TreeNode)node.Clone());
}

添加根节点将有助于确保“ PlusMinus”功能可见。
TreeNode rootNode = new TreeNode("Root Node");
treeViewTarget.Nodes.Add(rootNode);
foreach (TreeNode node in treeViewSource.Nodes)
{
    rootNode.Nodes.Add((TreeNode)node.Clone());
}
rootNode.Expand();

2
克隆仅执行“浅复制:”因此,将不会将要复制到新TreeView的节点的任何子节点复制。 - BillW
1
@BillW。我相信MSDN上说它会克隆整个子树。https://msdn.microsoft.com/zh-cn/library/system.windows.forms.treenode.clone(v=vs.110).aspx - surfasb
我刚刚测试了一下,它确实克隆了整个子树。 - Levi H
@surasb 注意,“浅复制”方面的影响是在TreeNode的Tag值为引用类型时发挥作用:引用MSDN文章:“Clone方法执行节点的浅表拷贝。如果Tag属性的值是引用类型,则原始节点和克隆节点都将指向相同的标记值单个实例。” - BillW

0

感谢大家的回答。结合所有的答案,这对我很有帮助。即使树形视图有多个层级。

  public void CopyTreeNodes(TreeView treeview1, TreeView treeview2)
    {
        TreeNode newTn;
        foreach (TreeNode tn in treeview1.Nodes)
        {
            newTn = new TreeNode(tn.Text, tn.Value);
            CopyChildren(newTn, tn);
            treeview2.Nodes.Add(newTn);
        }
    }

 public void CopyChildren(TreeNode parent, TreeNode original)
    {
        TreeNode newTn;
        foreach (TreeNode tn in original.ChildNodes)
        {
            newTn = new TreeNode(tn.Text, tn.Value);
            parent.ChildNodes.Add(newTn);
            CopyChildren(newTn, tn);
        }
    }

-1

您可以在所需的级别使用此功能

     public void RootCopy(TreeView treeview1, TreeView treeview2)
    {
        TreeNode newNode;
        foreach (TreeNode tnode in treeview1.Nodes)
        {
            newNode = new TreeNode(tnode.Text);
            treeview2.Nodes.Add(newNode);
            if (tnode.Nodes.Count != 0)
            {
                int _1index = tnode.Index;
                ChildsCopyLevel2(_1index, treeview1, treeview2);
            }


        }

    }


    public void ChildsCopyLevel2(int index1, TreeView TV1, TreeView TV2)
    {
        foreach (TreeNode Tnode in TV1.Nodes[index1].Nodes)
        {
            string Childtext = Tnode.Text;
            TV2.Nodes[index1].Nodes.Add(Childtext);
            if (Tnode.Nodes.Count != 0)
            {// ChildsCopyLevel3(Tnode.Nodes.Count, TV1, TV2);
                int _2index = Tnode.Index;
                ChildsCopyLevel3(index1, _2index, TV1, TV2);
            }
        }

    }


    public void ChildsCopyLevel3(int index1, int index2, TreeView TV1, TreeView TV2)
    {
        foreach (TreeNode Tnode in TV1.Nodes[index1].Nodes[index2].Nodes)
        {
            string Childtext = Tnode.Text;
            TV2.Nodes[index1].Nodes[index2].Nodes.Add(Childtext);
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接