Скопируйте все родительские и дочерние элементы treeView в другое treeView c # WinForms - PullRequest
9 голосов
/ 11 апреля 2011

Я пытаюсь скопировать все дерево (ровно все узлы) дерева (полностью) в другое дерево, используя этот код:

        TreeNodeCollection myTreeNodeCollection = treeView1.Nodes;

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

        treeView1.Nodes.CopyTo(myTreeNodeArray, 0);

        treeView2.Nodes.AddRange(myTreeNodeArray);

Но это не позволяет мне сделать это, оно просит либо удалить узлы в дереве исходного кода, либо использовать его Clone! Как я могу это сделать? Я не хочу, чтобы мой исходный древовидный список что-то терял в этом процессе.

** ОБНОВЛЕНИЕ ** Хорошо, ребята, я нашел сложный код (для меня !!), но как я могу использовать это?

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

Ответы [ 4 ]

12 голосов
/ 11 апреля 2011

попробуйте

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

С уважением

8 голосов
/ 15 сентября 2014

Как и ответ МохД, но с рекурсией, чтобы получить все узлы. (Узлы дочерних узлов)

    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);
        }
    } 
5 голосов
/ 17 июня 2012

Использование функции 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();
0 голосов
/ 04 февраля 2017

Вы можете использовать это на желаемом уровне

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