Brad
Martinez made this copy routine available via the newsgroups.
The three routines below combine to produce an effective way to
duplicate a TreeView with all its data. No API is used, yet the method executes quite quickly. To maximize speed when copying
a large TreeView, set the receiving TreeView's visible property to False before beginning the copy.
The method below assumes you've placed a second
TreeView on the form
for populating with the contents of the first. It is certainly possible however to use the Load statement to create a control array of
TreeViews if necessary. |
Option Explicit
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved.
' Some pages may also contain other copyrights by the author.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Distribution: You can freely use this code in your own
' applications, but you may not reproduce
' or publish this code on any web site,
' online service, or distribute as source
' on any media without express permission.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Brad Martinez, http://www.mvps.org/btmtz/
Private Sub Command1_Click()
CopyTreeview TreeView1, TreeView2
End Sub
Private Sub CopyTreeview(objTVSrc As TreeView, objTVDest As TreeView)
'Copies the source treeview to a destination
'treeview. Assumes that both treeviews use the
'same (or identical) Imagelists.
Dim nodeRoot As Node
objTVDest.Nodes.Clear
For Each nodeRoot In objTVSrc.Nodes
If (nodeRoot.Parent Is Nothing) Then
Call CopyTVParentNode(nodeRoot, objTVDest.Nodes)
End If
Next
End Sub
Private Sub CopyTVParentNode(nodeParent As Node, nodesDest As Nodes)
'Walks the specified source parent treeview node,
'and all of its children nodes, adding them to the
'specified destination Nodes collection.
'
'nodeParent: parent node to walk and copy from
'nodesDest : destination Nodes collection to copy to
Dim nodeDummy As Node
Dim nodeChild As Node
'First add the parent node to the destination nodes collection.
Set nodeDummy = CopyNode(nodeParent, nodesDest)
'Get the current parent node's first child
Set nodeChild = nodeParent.Child
'Now walk through the current parent node's children
'appending the current child node's text to the passed string
Do While Not (nodeChild Is Nothing)
'If the current child node has its own children...
If nodeChild.Children Then
'Recursively call this proc copying all of its children
'(it becomes the new parent node)
Call CopyTVParentNode(nodeChild, nodesDest)
Else
'Add the child node to the destination nodes collection.
Set nodeDummy = CopyNode(nodeChild, nodesDest)
End If
'Get the current child node's next sibling
Set nodeChild = nodeChild.Next
Loop
End Sub
Private Function CopyNode(nodeSrc As Node, nodesDest As Nodes) As Node
With nodeSrc
If (.Parent Is Nothing) Then 'Root node
Set CopyNode = nodesDest.Add(, , _
.Key, .Text, _
.Image, .SelectedImage)
CopyNode.Expanded = True
Else 'Child node
Set CopyNode = nodesDest.Add(.Parent.Index, _
tvwChild, _
.Key, .Text, _
.Image, .SelectedImage)
CopyNode.Expanded = True
End If
End With
End Function
|