IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Multiple affiche des nœuds enfants après plusieurs déploiement du nœud parent dans un treeview [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Par défaut Multiple affiche des nœuds enfants après plusieurs déploiement du nœud parent dans un treeview
    Bonjour,
    J'ai un treeview qui déploie le disque local (c, lorsque je clique sur un noeud, celui-ci se déploie et affiche les noeuds enfants.
    Or, si je referme le premier noeud et que je l'ouvre à nouveau, cela m'affiche les noeuds enfants mais 2 fois et si je répète l'action les noeuds enfants s'affichent 3 fois...
    Explication en image:
    Mon treeview avec le noeud de mon dossier "test" déployé qu'une seule fois: Nom : Capture 1.PNG
Affichages : 623
Taille : 29,1 Ko
    Mon treeview avec le noeud de mon dossier "test" déployé 4 fois: Nom : Capture 2.PNG
Affichages : 520
Taille : 35,3 Ko

    Important, je précise que si le dossier sélectionné ne comporte qu'un seul dossier le problème ne se pose pas, dans la 2ème image le dossier "Sanbox" qui ne contient qu'1 seul dossier, a été ouvert 10 fois sans s'incrémenter à chaque fois.

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ' On s'abonne à l'évènement BeforeExpand du TreeView (on le fait après avoir populé le TreeView)
            AddHandler Me.TreeView1.BeforeExpand, AddressOf Me.TreeView1_BeforeExpand
        End Sub
     
        Private Sub PopulateTreeView()
            Dim rootNode As TreeNode
            Dim info As New DirectoryInfo("C:\")
     
            If info.Exists Then
                rootNode = New TreeNode(info.Name)
                rootNode.Tag = info
                rootNode.Expand()
                GetDirectories(info.GetDirectories(), rootNode)
                TreeView1.Nodes.Add(rootNode)
            End If
        End Sub
     
        Private Sub GetDirectories(ByVal subDirs() As DirectoryInfo, ByVal nodeToAddTo As TreeNode)
     
            Dim aNode As TreeNode
            Dim subSubDirs() As DirectoryInfo
            Dim subDir As DirectoryInfo
            For Each subDir In subDirs
                aNode = New TreeNode(subDir.Name, 0, 0)
                aNode.Tag = subDir
                aNode.ImageKey = "folder"
     
                Me.AddFakeNode(aNode)
     
                Try
                    subSubDirs = subDir.GetDirectories()
                Catch e As UnauthorizedAccessException
                    subSubDirs = Nothing
                End Try
     
                If Not subDir.Attributes = (FileAttributes.Hidden Or subDir.Attributes) Then
                    nodeToAddTo.Nodes.Add(aNode)
                End If
            Next subDir
        End Sub
     
        Private Sub AddFakeNode(ByVal nodeToAddTo As TreeNode)
            ' On ajoute le noeud fantome pour afficher le signe +
            nodeToAddTo.Nodes.Insert(0, New TreeNode(String.Empty))
        End Sub
     
        Private Sub RemoveFakeNode(ByVal nodeToRemoveFrom As TreeNode)
            ' On supprime le noeud fantome
            nodeToRemoveFrom.Nodes.RemoveAt(0)
        End Sub
     
        Private Sub TreeView1_BeforeExpand(sender As Object, e As TreeViewCancelEventArgs)
            RemoveFakeNode(e.Node)
     
            ' On charge le premier niveau de dossiers pour le noeud en cours de traitement
            Dim di As New DirectoryInfo(e.Node.FullPath)
            GetDirectories(di.GetDirectories(), e.Node)
        End Sub
     
        Public Sub New()
            InitializeComponent()
            PopulateTreeView()
        End Sub 'New
     
        Private Sub showCheckedNodesButton_Click(ByVal sender As Object, ByVal e As EventArgs)
            ' Disable redrawing of treeView1 to prevent flickering 
            ' while changes are made.
            treeView1.BeginUpdate()
     
            ' Collapse all nodes of treeView1.
            treeView1.CollapseAll()
     
            ' Add the CheckForCheckedChildren event handler to the BeforeExpand event.
            AddHandler treeView1.BeforeExpand, AddressOf CheckForCheckedChildren
     
            ' Expand all nodes of treeView1. Nodes without checked children are 
            ' prevented from expanding by the checkForCheckedChildren event handler.
            treeView1.ExpandAll()
     
            ' Remove the checkForCheckedChildren event handler from the BeforeExpand 
            ' event so manual node expansion will work correctly.
            RemoveHandler treeView1.BeforeExpand, AddressOf CheckForCheckedChildren
     
            ' Enable redrawing of treeView1.
            treeView1.EndUpdate()
        End Sub 'showCheckedNodesButton_Click
     
        ' Prevent expansion of a node that does not have any checked child nodes.
        Private Sub CheckForCheckedChildren(ByVal sender As Object, ByVal e As TreeViewCancelEventArgs)
            If Not HasCheckedChildNodes(e.Node) Then
                e.Cancel = True
            End If
        End Sub 'CheckForCheckedChildren
     
        ' Returns a value indicating whether the specified 
        ' TreeNode has checked child nodes.
        Private Function HasCheckedChildNodes(ByVal node As TreeNode) As Boolean
            If node.Nodes.Count = 0 Then
                Return False
            End If
            Dim childNode As TreeNode
            For Each childNode In node.Nodes
                If childNode.Checked Then
                    Return True
                End If
                ' Recursively check the children of the current child node.
                If HasCheckedChildNodes(childNode) Then
                    Return True
                End If
            Next childNode
            Return False
        End Function 'HasCheckedChildNodes
     
     
     
        Private Sub treeView1_NodeMouseClick(ByVal sender As Object, ByVal e As TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick
     
            Dim newSelected As TreeNode = e.Node
            ListView1.Items.Clear()
            Dim nodeDirInfo As DirectoryInfo = CType(newSelected.Tag, DirectoryInfo)
            Dim subItems() As ListViewItem.ListViewSubItem
            Dim item As ListViewItem = Nothing
            Dim dir As DirectoryInfo
            For Each dir In nodeDirInfo.GetDirectories()
                item = New ListViewItem(dir.Name, 0)
                subItems = New ListViewItem.ListViewSubItem() {New ListViewItem.ListViewSubItem(item, "Directory"), New ListViewItem.ListViewSubItem(item, _
                    dir.LastAccessTime.ToShortDateString())}
                item.SubItems.AddRange(subItems)
                ListView1.Items.Add(item)
            Next dir
            Dim file As FileInfo
            For Each file In nodeDirInfo.GetFiles()
                item = New ListViewItem(file.Name, 1)
                subItems = New ListViewItem.ListViewSubItem() {New ListViewItem.ListViewSubItem(item, "File"), New ListViewItem.ListViewSubItem(item, _
                    file.LastAccessTime.ToShortDateString())}
                item.SubItems.AddRange(subItems)
                ListView1.Items.Add(item)
            Next file
     
            ListView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)
     
        End Sub
     
        'Selection des checkbox avec heritage aux sous dossiers:
        Private Sub CheckAllChildNodes(TreeNode As TreeNode, nodeChecked As Boolean)
            Dim node As TreeNode
            For Each node In TreeNode.Nodes
                node.Checked = nodeChecked
                If node.Nodes.Count > 0 Then
                    'Si le nœud actuel possède des nœuds enfant, appelez la méthode CheckAllChildsNodes récursive.  
                    Me.CheckAllChildNodes(node, nodeChecked)
                End If
            Next (node)
        End Sub
        Private Sub node_AfterCheck(sender As Object, e As TreeViewEventArgs) Handles TreeView1.AfterCheck
            'Le code s'exécute uniquement si l'utilisateur a provoqué l'état activé au changement .  
            If e.Action <> TreeViewAction.Unknown Then
                If e.Node.Nodes.Count > 0 Then
                    'Appelle la méthode de CheckAllChildNodes, en passant dans le courant   
                    'valeur Analyse du TreeNode dont vérifié l'état changé.   
                    Me.CheckAllChildNodes(e.Node, e.Node.Checked)
                End If
            End If
     
        End Sub
    Merci de votre aide.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour,

    Il faut effacer la liste des noeuds (au cas ou on l'avait déjà construite) avant de la construire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Private Sub GetDirectories(ByVal subDirs() As DirectoryInfo, ByVal nodeToAddTo As TreeNode)
            Dim aNode As TreeNode
            Dim subSubDirs() As DirectoryInfo
            Dim subDir As DirectoryInfo
            nodeToAddTo.Nodes.Clear() ' vider avant de construire
            For Each subDir In subDirs
                '...
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Par défaut
    Super, merci rv26t, ça marche niquel.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher des sous-menus sur plusieurs lignes
    Par laurentSc dans le forum Mise en page CSS
    Réponses: 21
    Dernier message: 20/06/2014, 10h24
  2. Réponses: 0
    Dernier message: 12/03/2009, 00h53
  3. [Evènement]Comment gérer ceux des CTRL enfants sans déclencher celui du CTRL parent ?
    Par Anto03 dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 29/09/2008, 13h57
  4. Forcer et verouiller cochage des parents dans une treeview
    Par supertoms dans le forum VBA Access
    Réponses: 0
    Dernier message: 15/04/2008, 20h30
  5. Réponses: 2
    Dernier message: 13/12/2006, 20h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo