Copy all parent treeView element and child elements to another C # WinForms treeView

I am trying to copy the whole tree (exactly all the nodes) of the tree (completely) to another tree using this code:

TreeNodeCollection myTreeNodeCollection = treeView1.Nodes; TreeNode[] myTreeNodeArray = new TreeNode[treeView1.Nodes.Count]; treeView1.Nodes.CopyTo(myTreeNodeArray, 0); treeView2.Nodes.AddRange(myTreeNodeArray); 

But this does not allow me to do this, he asks either to remove the nodes in the source tree, or use it Clone! How can i do this? I do not want my source tree to lose anything in this process.

** UPDATE ** Ok guys, I found complex code (for me !!), but how can I use this?

  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; } 
+8
c # clone copy treeview
source share
4 answers

try it

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

My greetings

+11
source share

Like MohD's answer, but with recursion to get all nodes. (Node nodes)

  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); } } 
+6
source share

Using the node.Clone () function also works ...

 foreach (TreeNode node in treeViewSource.Nodes) { treeViewTarget.Nodes.Add((TreeNode)node.Clone()); } 

Adding a node root will help provide the "PlusMinus" functionality.

 TreeNode rootNode = new TreeNode("Root Node"); treeViewTarget.Nodes.Add(rootNode); foreach (TreeNode node in treeViewSource.Nodes) { rootNode.Nodes.Add((TreeNode)node.Clone()); } rootNode.Expand(); 
+3
source share

You can use it at your desired level.

  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); } } 
-one
source share

All Articles