Treeview : récupérer le chemin complet d'un noeud

Description

Le chemin complet d'un noeud "x" peut être récupérer via "x.FullPath". Cette méthode énumère en interne chaque père de "x". Or, si "y" a le même père que "x", il est inutile de remonter jusqu'à la racine de l'arbre... Pour combler cette lacune, je propose ici une autre méthode (TVWGetFullPath) qui tire avantage des précédents appels.

Source / Exemple :


'**************************************************************************************
' .FullPath vs GetFullPath
'
'Programmeur :             Egyde (sendoval_fr@yahoo.fr)
'Date de création :        22/02/06
'**************************************************************************************
Option Explicit

Private m_strParentPath As String
Private m_strParentKey  As String

'pr l'estimation des performances
Public Declare Function GetTickCount Lib "kernel32" () As Long

'pr récupérer le chemin complet d'un noeud,
'on fait appel à la propriété .FullPath
'Note : pour changer le séparateur (ici "/"), voir .PathSeparator du treeview
Public Function TVWFullPath(ByRef tSourceNode As Node) As String
    TVWFullPath = tSourceNode.FullPath
    TVWFullPath = Mid$(TVWFullPath, 2, Len(TVWFullPath) - 1) & "/"
End Function

'pr récupérer le chemin complet d'un noeud,
'on check si le noeud visité n'est pas le fils du père précédemment visité.
'Si c'est le cas, on renvoi le chemin complet en tenant compte de l'information
'précédemment sauvegardée. Si c'est pas le cas, on fait appel à la propriété
'.FullPath
Public Function TVWGetFullPath(ByRef tSourceNode As Node) As String
        
    If tSourceNode.Parent Is Nothing Then ' on est à la racine
        
        m_strParentKey = "K0"
        m_strParentPath = "/"
        TVWGetFullPath = "/"
    
    Else

        If m_strParentKey <> tSourceNode.Parent.Key Then
            'le noeud courant n'est pas au même niveau que le noeud précédent
            'on met donc à jour le chemin du père
            m_strParentKey = tSourceNode.Parent.Key
            m_strParentPath = TVWFullPath(tSourceNode.Parent)
        End If
    
        'on concatène au chemin du père le texte du fils
        TVWGetFullPath = m_strParentPath & tSourceNode.Text & "/"

    End If
    
End Function

Conclusion :


Lorsque l'arbre doit être visité de façon récursive (comme c'est le cas pour un explorateur automatique par exemple), la stratégie proposée est plus efficace qu'un appel naif à .FullPath (moyenne obtenue pour 9331 noeuds - voir projet joint) :

TVWFullPath : 0.60615 tick (par noeud, en moyenne)
TVWGetFullPath : 0.56093 tick

Toutefois, dans le cas d'un parcours "aléatoire" (ex : un utilisateur qui clic sur un noeud quelconque), .FullPath est, comme on pourrait s'y attendre, plus efficace en moyenne :

TVWFullPath : 0.81224 tick (par noeud, en moyenne)
TVWGetFullPath : 0.84225 tick

Un bon compromis consiste donc à utiliser .FullPath pour récupérer le chemin de noeuds qui n'ont a priori aucun lien de parenté et TVWGetFullPath lorsque la récupération du chemin se fait de façon récursive.

Codes Sources

A voir également

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.