Copie de treeview

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 145 fois - Téléchargée 42 fois

Contenu du snippet

Ce code permet de copier l'arborescence d'un treeview dans un autre treeview.

Source / Exemple :


Public Function Copier(Menu_P As TreeView, MenuTree_P As TreeView) As TreeView

Dim i%
Dim Node_L As Node
Dim chaine As String

    For i = 1 To MenuTree_P.Nodes.Count

    If (i = 1) Then
       Set Node_L = Menu_P.Nodes.Add(, , MenuTree_P.Nodes(i).Key, MenuTree_P.Nodes(i).text, MenuTree_P.Nodes(i).Image, MenuTree_P.Nodes(i).SelectedImage)

       Set Node_L = MenuTree_P.Nodes(i)
    Else
      chaine = groupe.TreeView1.Nodes(i).Parent.Key  'groupe est le nom de la form, chaine recupere la cle du parent afin de créer ses fils
        
      Set Node_L = Menu_P.Nodes.Add(chaine, tvwChild, MenuTree_P.Nodes(i).Key, MenuTree_P.Nodes(i).text, MenuTree_P.Nodes(i).Image, MenuTree_P.Nodes(i).SelectedImage)

       Set Node_L = MenuTree_P.Nodes(i)
    
   End If
    Next i

End Function

'Ne pas oublié de bien initialiser les ImageList des treeviews.

Conclusion :


Pour ma part, ce code est insérer dans un module mais il fonctionne très bien à l'intérieur d'une form.
Pour l'appel de la fonction:

Call Copier (TreeView1,TreeView2) TreeView1 est l'arbre de destination et TreeView2 la source

A voir également

Ajouter un commentaire Commentaires
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
28 janvier 2013

moi j'ai essayer cela cela marche très bien et bien plus rapide(il n'y a pas le IF ! ! !), et je vous laisse un petit cadeau en plus :)

Public Sub TreeView_to_TreeView(ByRef source As TreeView, ByRef Destination As TreeView)

Dim i As Integer
Destination.ImageList = source.ImageList
Destination.Nodes.Add , , source.Nodes(1).key, source.Nodes(1).Text, source.Nodes(1).Image, source.Nodes(1).SelectedImage
For i = 2 To source.Nodes.Count
Destination.Nodes.Add source.Nodes(i).Parent.key, tvwChild, source.Nodes(i).key, source.Nodes(i).Text, source.Nodes(i).Image, source.Nodes(i).SelectedImage
Next i

End Sub

Public Enum treeview_open_
Le_1er_niveau = 1
Les_DIX_1er_niveau = 10
Tous_niveau = 100
End Enum
Public Sub treeview_open(la_TreeView As TreeView, Optional ByVal nb_A_ouvrir As treeview_open_ = 1)
Dim i%
Select Case nb_A_ouvrir
Case 1: la_TreeView.Nodes(1).Expanded = True
Case 10
For i% = 1 To 10
la_TreeView.Nodes(i%).Expanded = True
Next i%
Case 100
For i% = 1 To la_TreeView.Nodes.Count
la_TreeView.Nodes(i%).Expanded = True
Next i%
End Select
End Sub
Messages postés
37
Date d'inscription
vendredi 1 février 2002
Statut
Membre
Dernière intervention
26 juillet 2007

Désolé, je me suis trompé. Voici la bonne solution (à mon avis).
Celle-ci prend en charge plusieurs noeuds racines.
Une autre remarque sur ton code: tu as fais une "Function" qui ne renvoit rien, il faut la transformer en une "Sub".


Public Sub Copier(ByRef Source As TreeView, ByRef Destination As TreeView)
Dim i As Integer

Destination.ImageList = Source.ImageList
For i = 1 To Source.Nodes.Count
If Source.Nodes(i).Parent Is Nothing Then
Destination.Nodes.Add , , Source.Nodes(i).Key, Source.Nodes(i).Text, Source.Nodes(i).Image, Source.Nodes(i).SelectedImage
Else
Destination.Nodes.Add Source.Nodes(i).Parent.Key, tvwChild, Source.Nodes(i).Key, Source.Nodes(i).Text, Source.Nodes(i).Image, Source.Nodes(i).SelectedImage
End If
Next i
End Sub
Messages postés
37
Date d'inscription
vendredi 1 février 2002
Statut
Membre
Dernière intervention
26 juillet 2007

Je te propose une version un peu épurée de ton code (seul ma quatrième remarque n'est pas corrigée -> à toi de voir ;)
J'ajoute que la déclaration de ta chaine était aussi abusive (elle représente un objet auquel on peut accéder facilement)
De plus, il est plus commun de donner la source avant la destination lors d'une copie

Voilà ma proposition:
Public Function Copier(ByRef Source As TreeView, ByRef Destination As TreeView) As TreeView
Dim i As Integer
Dim tmpNode As Node

Destination.ImageList = Source.ImageList
For i = 1 To Source.Nodes.Count
If (i = 1) Then
Set tmpNode = Destination.Nodes.Add(, , Source.Nodes(i).Key, Source.Nodes(i).Text, Source.Nodes(i).Image, Source.Nodes(i).SelectedImage)
Set tmpNode = Source.Nodes(i)
Else
Set tmpNode = Destination.Nodes.Add(Source.Nodes(i).Parent.Key, tvwChild, Source.Nodes(i).Key, Source.Nodes(i).Text, Source.Nodes(i).Image, Source.Nodes(i).SelectedImage)
Set tmpNode = Source.Nodes(i)
End If
Next i
End Function
Messages postés
37
Date d'inscription
vendredi 1 février 2002
Statut
Membre
Dernière intervention
26 juillet 2007

4/10 parce que le principe est à peu près correct, mais:
- code non portable à cause de "chaine = groupe.TreeView1.Nodes(i).Parent.Key" (si on met deux TreeViews appelés T1 et T2, TreeView1 devient un identificateur inconnu -> erreur)
- déclaration d'un objet pas nécessaire dans ton code: "Dim Node_L As Node"
- manipulation de cet objet sans raison (tu lui affecte une valeur que tu n'utilise pas)
- ce code ne marche que pour un arbre simple avec un seul noeud racine
Messages postés
171
Date d'inscription
mardi 17 décembre 2002
Statut
Membre
Dernière intervention
6 mai 2007

Excellent 10/10, c'est tout ce q'il me fallait :o)
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.