none
Afficher un répertoire avec ses fichiers et dossiers sur un TreeView [VB.NET] RRS feed

  • Question

  • Bonjour, je commence à utiliser le TreeView au lieu d'utiliser la ListBox, ce qui me permet, notamment sur l'affichage d'un répertoire, est plus avantageux que la ListBox. Le problème c'est que je n'arrive pas à afficher un répertoire dans un TreeView avec les fichiers et les autres dossiers du répertoires.
    mardi 23 mai 2017 18:42

Réponses

  • Vous devriez poster votre code pour avoir de l'aide... ce serait quand même plus honnête que de quémander une solution toute faite!

    Voici ce que vous demandez:

    ' Code inspiré d'une recherhce sur le Net....
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ' Utilisation d'une ImageList pour les icones de dossier et fichiers
            ' Contraindre les icones à taille 20,20
            ImageList1.ImageSize = New Size(20, 20)
            ' Icone de dossier
            Dim oIcon As System.Drawing.Icon
            ImageList1.Images.Add(My.Resources.shell32_4) 'Dossier
            ' Icone de Fichier texte "lifté" d'un fichier existant...
            If System.IO.File.Exists(Chemin & "Resultats.txt") Then
                oIcon = System.Drawing.Icon.ExtractAssociatedIcon("C:\SITE_ANGLET\20170331_ANGLET\20170331_ANGLET_Resultats.txt")
                ImageList1.Images.Add(oIcon)
            End If
            ' Icone pour type de fichier TIFF
            ImageList1.Images.Add(My.Resources.TIFF) 'TIF
    
            ' Inqiquer les icones pour le Treeview
            TreeView1.ImageList = ImageList1
    
            ' Dossier de démarrage
            Dim rootDir As String = String.Empty
            'Test sur un Dossier
            rootDir = "C:\UNDOSSIEREXIANT"
            Try
                ' Indique la base de départ
                Dim topNode As New TreeNode(rootDir)
                ' Créé le tag du noeud
                topNode.Tag = rootDir
                ' Ajout le noeud de base au TreeView.
                TreeView1.Nodes.Add(topNode)
                ' Pour le Noeud de base il faut manuellement indiquer le nom et l'icone            
                TreeView1.TopNode.ImageIndex = 0
    
                ' Parcourt le TreeView depuis ce point
                PopulateFolder(rootDir, TreeView1.Nodes(0)) 
            Catch ex As Exception
                Debug.Print("Exception: " & ex.Message)
            End Try
            
        End Sub
    
        Private Sub PopulateFolder(folder As String, parentNode As TreeNode,
                                   Optional pattern As String = "*")
            ' Création du noeud pour le Dossier en cours, 
            '   Ajout des dossiers Child
            '   Ajout des fichiers contenus dans le dossier en cours
            Dim thisFolder As String
            Dim tn As TreeNode
    
            For Each d As String In Directory.EnumerateDirectories(folder, pattern)
                thisFolder = GetLastFolder(d)
    
                tn = New TreeNode(thisFolder, 1, 1)
                parentNode.Nodes.Add(tn)
                ' Indiquer l'icone
                parentNode.LastNode.ImageIndex = 0
    
                ' Recursion pour ajouter les dossiers Child
                PopulateFolder(d, tn)
                ' Ajout des fichiers de ce dossier
                PopulateFiles(tn, d)
            Next
            
        End Sub
    
    ' Recherche du dernier Dossier dans la branche
        Private Function GetLastFolder(fullPath As String) As String
            ' Dernier dossier dans le chemin
            Dim DirSep = Path.DirectorySeparatorChar
            Dim split = fullPath.Split(DirSep)
            
            Return split(split.Length - 1)
        End Function
    
    ' Liste les fichiers présents dans un Noeud
        Private Sub PopulateFiles(tn As TreeNode, folder As String)
            For Each f As String In Directory.EnumerateFiles(folder, "*.*")
                ' Traitement particulier pour les fichiers TIF
                If f.Contains("TIF") Then
                    tn.Nodes.Add("", Path.GetFileName(f), 2)
                Else
                    tn.Nodes.Add("", Path.GetFileName(f), 1)
                End If
    
            Next
        End Sub

    • Marqué comme réponse Théo Hénon mercredi 31 mai 2017 13:57
    mercredi 31 mai 2017 08:57

Toutes les réponses

  • Bonsoir Théo,

    Ce code vous sera très utile : 

    Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim drives As System.Collections.ObjectModel.ReadOnlyCollection(Of IO.DriveInfo) = My.Computer.FileSystem.Drives
        Dim rootDir As String = String.Empty
        For i As Integer = 0 To drives.Count - 1
        If Not drives(i).IsReady Then
            Continue For
        End If
        rootDir = drives(i).Name
        TreeView1.Nodes.Add(rootDir)
        PopulateTreeView(rootDir, TreeView1.Nodes(i))
    Next
    End Sub
    
    Private Sub PopulateTreeView(ByVal dir As String, ByVal parentNode As TreeNode)
        Dim folder As String = String.Empty
        Try
            Dim folders() As String = IO.Directory.GetDirectories(dir)
            If folders.Length <> 0 Then
                Dim childNode As TreeNode = Nothing
                For Each folder In folders
                    childNode = New TreeNode(folder)
                    parentNode.Nodes.Add(childNode)
                    PopulateTreeView(folder, childNode)
                Next
            End If
        Catch ex As UnauthorizedAccessException
            parentNode.Nodes.Add(folder & ": Access Denied")
        End Try
    End Sub	
    
    

    J'espère que j'ai bien répondu à votre question.

    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post

    Vous pouvez me suivre sur Twitter : https://twitter.com/NordineMhoumadi


    Download my NEW FREE application MCP PREPARATION in the Windows 10 Store for preparing your Microsoft Certification or test your skills in Microsoft Technologies;

    mardi 23 mai 2017 18:55
  • Le code précédent fonctionnera bien sûr, mais si vous commencez à C:\ et que votre machine a un peu d'usage vous pouvez attendre longtemps avant que PopulateTreeView ait tout scanné...

    Il vous manquera encore les fichiers car la suggestion ne reprend que GetDirectories...

    Il y a plusieurs solutions pour que vous puissiez utiliser TreeView pour mapper l'ensemble de vos Drives et les fichiers:

    -Utilisez EnumarateDirectories si vous n'avez pas besoin de toutes les infos fournies par GetDirectories mais seulement le nom, et EnumarateFiles pour faire la liste des fichiers

    -Ne récoltez pas toute la structure au Load mais attendez que l'utilisateur clique sur un Node et gérez BeforeExpand et AfterExpand

    Recherchez EnumarateDirectories et Before/AfterExpand et poster du code si vous avez des soucis et on vous aidera...

    mardi 23 mai 2017 21:41
  • Si c'est pour permettre un choix utilisateur, utiliser OpenFileDialog ou SHBrowseForFolder()

    Pour un affichage, c'est inclus dans le Shell avec par exemple IExplorerBrowser pour afficher un explorateur dans une fenêtre.

    mercredi 24 mai 2017 08:35
  • Bonjour, le problème avec ce code c'est quand j'essaye de changer le "My.Computer.FileSystem.Drives", et bien cela me met une erreur. Ce que je cherche c'est afficher le contenu du dossier (par exemple: My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\WebIDE\Projects\"
    mercredi 24 mai 2017 16:59
  • Bonjour,

    vous pouvez commencer comme ceci :

    le code :

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Dim NodeArray(0) As TreeNode
            NodeArray(0) = New TreeNode("My Documents")
            NodeArray(0).Tag = My.Computer.FileSystem.SpecialDirectories.MyDocuments
            NodeArray(0).Nodes.Add("...")
            TreeView1.Nodes.AddRange(NodeArray)
        End Sub
    
    
        Private Sub TreeView1_BeforeExpand(sender As System.Object, e As System.Windows.Forms.TreeViewCancelEventArgs) Handles TreeView1.BeforeExpand
            If e.Node.Nodes.Count > 0 Then
                If e.Node.Nodes(0).Text = "..." AndAlso e.Node.Nodes(0).Tag Is Nothing Then
                    e.Node.Nodes.Clear()
                    Dim dirs As String() = Directory.GetDirectories(e.Node.Tag.ToString())
                    For Each dir As String In dirs
                        Dim di As New DirectoryInfo(dir)
                        Dim node As New TreeNode(di.Name, 0, 1)
                        Try
                            node.Tag = dir
                            If di.GetDirectories().Count() > 0 Then
                                node.Nodes.Add(Nothing, "...", 0, 0)
                            End If
                        Catch ex1 As Exception
                        Finally
                            e.Node.Nodes.Add(node)
                        End Try
                    Next
                End If
            End If
        End Sub
    J'espère que j'ai bien répondu à votre question.

    Si c'est le cas, n'hésitez pas à mettre ma réponse en réponse à votre post,

    Cordialement,


    • Modifié zorro591 jeudi 25 mai 2017 15:08
    jeudi 25 mai 2017 15:07
  • Merci pour cette réponse, mais le problème c'est que cela n'affiche pas les extensions des fichiers (bon c'est facultatif, mais c'est pour distinguer les fichiers des dossiers), et le deuxième problème c'est que le TreeView ne développe pas les dossiers qui ne contiennent pas d'autres dossiers, alors qu'ils contiennent des fichiers.
    mardi 30 mai 2017 17:32
  • Vous devriez poster votre code pour avoir de l'aide... ce serait quand même plus honnête que de quémander une solution toute faite!

    Voici ce que vous demandez:

    ' Code inspiré d'une recherhce sur le Net....
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ' Utilisation d'une ImageList pour les icones de dossier et fichiers
            ' Contraindre les icones à taille 20,20
            ImageList1.ImageSize = New Size(20, 20)
            ' Icone de dossier
            Dim oIcon As System.Drawing.Icon
            ImageList1.Images.Add(My.Resources.shell32_4) 'Dossier
            ' Icone de Fichier texte "lifté" d'un fichier existant...
            If System.IO.File.Exists(Chemin & "Resultats.txt") Then
                oIcon = System.Drawing.Icon.ExtractAssociatedIcon("C:\SITE_ANGLET\20170331_ANGLET\20170331_ANGLET_Resultats.txt")
                ImageList1.Images.Add(oIcon)
            End If
            ' Icone pour type de fichier TIFF
            ImageList1.Images.Add(My.Resources.TIFF) 'TIF
    
            ' Inqiquer les icones pour le Treeview
            TreeView1.ImageList = ImageList1
    
            ' Dossier de démarrage
            Dim rootDir As String = String.Empty
            'Test sur un Dossier
            rootDir = "C:\UNDOSSIEREXIANT"
            Try
                ' Indique la base de départ
                Dim topNode As New TreeNode(rootDir)
                ' Créé le tag du noeud
                topNode.Tag = rootDir
                ' Ajout le noeud de base au TreeView.
                TreeView1.Nodes.Add(topNode)
                ' Pour le Noeud de base il faut manuellement indiquer le nom et l'icone            
                TreeView1.TopNode.ImageIndex = 0
    
                ' Parcourt le TreeView depuis ce point
                PopulateFolder(rootDir, TreeView1.Nodes(0)) 
            Catch ex As Exception
                Debug.Print("Exception: " & ex.Message)
            End Try
            
        End Sub
    
        Private Sub PopulateFolder(folder As String, parentNode As TreeNode,
                                   Optional pattern As String = "*")
            ' Création du noeud pour le Dossier en cours, 
            '   Ajout des dossiers Child
            '   Ajout des fichiers contenus dans le dossier en cours
            Dim thisFolder As String
            Dim tn As TreeNode
    
            For Each d As String In Directory.EnumerateDirectories(folder, pattern)
                thisFolder = GetLastFolder(d)
    
                tn = New TreeNode(thisFolder, 1, 1)
                parentNode.Nodes.Add(tn)
                ' Indiquer l'icone
                parentNode.LastNode.ImageIndex = 0
    
                ' Recursion pour ajouter les dossiers Child
                PopulateFolder(d, tn)
                ' Ajout des fichiers de ce dossier
                PopulateFiles(tn, d)
            Next
            
        End Sub
    
    ' Recherche du dernier Dossier dans la branche
        Private Function GetLastFolder(fullPath As String) As String
            ' Dernier dossier dans le chemin
            Dim DirSep = Path.DirectorySeparatorChar
            Dim split = fullPath.Split(DirSep)
            
            Return split(split.Length - 1)
        End Function
    
    ' Liste les fichiers présents dans un Noeud
        Private Sub PopulateFiles(tn As TreeNode, folder As String)
            For Each f As String In Directory.EnumerateFiles(folder, "*.*")
                ' Traitement particulier pour les fichiers TIF
                If f.Contains("TIF") Then
                    tn.Nodes.Add("", Path.GetFileName(f), 2)
                Else
                    tn.Nodes.Add("", Path.GetFileName(f), 1)
                End If
    
            Next
        End Sub

    • Marqué comme réponse Théo Hénon mercredi 31 mai 2017 13:57
    mercredi 31 mai 2017 08:57