Afficher contenu treeview dan sun listview

Résolu
fredoo033 Messages postés 12 Date d'inscription mardi 25 mars 2008 Statut Membre Dernière intervention 7 juillet 2008 - 3 juil. 2008 à 16:14
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012 - 7 juil. 2008 à 18:50
Bonjour à tous je ne sais pas si c'est le bon endroit mais c'est celui qui me semble le mieu. je voudrai réaliser un code du style de l'explorateur
windows. En fait je réalise un serveur me permettant de relever des
valeurs dans des automates.

Chaque automate à ses propres valeurs.

voici comment je voudrai afficher les choses :


Treeview : "Nom automate"|_ _ _ _ _ adresse valeur 1|_ _ _ _ _ adresse valeur 2|_ _ _ _ _ ....... "Nom automate 2"|_ _ _ _ _ adresse valeur 1|_ _ _ _ _ adresse valeur 2|_ _ _ _ _ .......dans mon listview :

quand je clique sur "Nom automate" dans le treeview je voudrai que les
valeurs de "nom automate" s'affiche dans le listview. Si je clique sur
"Nom automate 2" les valeurs de "nom automate 2" s'affiche et efface
les valeurs précédentes.


Je pense que c'est possible grace à la fonction expand du treeview.
J'arrive à lire les données ce n'est pas un problème mais c'est cette
gestion d'affichage quui me pose problème. J'espère avoir été clair et
je remercie par avance toute les personnes qui vont m'aider.

 

5 réponses

cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
3 juil. 2008 à 21:27
Salut,


La fonction 'expand' du TreeView ne fait que afficher les enfants du parent "Nom automat X"... dans le TreeView!

Un TreeView ne peut pas agir directement sur un ListView car ceux sont 2 contrôles indépendant.

Pour lié un TreeView à un ListView, il faut donc écrire quelques lignes
de VB pour dire : "Si l'on clique sur l'item X de TreeView, alors on
affiche 'ce que l'on veut' dans un ListView".


Il y a donc au moins au minimum 2 procédures à écrire :

1° et d'après le TreeView : Détecter le click (évènement NodeClick) sur l'item choisi (mémoriser
les informations qu'il faut?) et appeler une procédure concernant
l'affichage du ListView, au l'occurence la 2° qui suit:

2° et d'après le ListView : Traitement de l'affichage d'après les information mémorisés du TreeView.


Rassure-toi, ça n'est pas bien compliqué.

Je ne veux pas te donner un exemple tout fait pour tes besoins car je ne connais pas la
nature de tes valeurs (NomAutomate\Valeur 1, NomAutomate\Valeur 2,
etc).


Si ces valeurs ne sont que des caractères alpha-numérique (type String)
pas trop long, il serait peut-être intéressant de les mémoriser
directement dans la propriété Key ou Tag de chaque Item du TreeView
(TreeView1.Nodes(x).Tag). Dès lors, toutes les informations (adresse de
chaque valeur ET sa valeur associée) sont mémorisées directement dans
le TreeView. Et l'affichage dans le ListView ne dépend donc que du TreeView.

titicar
3
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
4 juil. 2008 à 21:42
Salut,
Pour trouver tous les enfants associés à un parent, il y a plusieurs possibilités.
Je vais en donner une qui fonctionne pour ton cas, mais pas pour les cas en général, du genre FileExplorer.

ATTENTION : J'utilise les contrôles SP6 [Microsoft Windows Common Controls 6.0 (SP6)] concernant les TreeView, ListView, etc

Je me base sur la propriété TreeView.Nodes(X).Parent
En fait, on scrute tous les nodes et l'on vérifie pour chacun d'eux si le parent correspond au node sur lequel on a cliqué.
On peut faire cette vérif d'après plusieurs propriétés comme TreeView.Nodes(X).Parent ou '.Key' ou encore '.FullPath'.

Dans ton cas, on peut donc utiliser '.Parent' et donc à la condition que tes "Nom automate" ne soient pas utilisés comme nom pour les enfants. De même, les enfants ne doivent pas développer des 'sous-enfant' (et devenir eux-même parents).

Dans ce contexte, la recherche des enfants pourrait ressembler à ça:    ' NodeParent type String défini node sur lequel on a cliqué
    For X = 1 To TreeView1.Nodes.Count
        If TreeView1.Nodes(X).Parent = NodeParent Then
            '# Ce node est un enfant de NodeParent. On l'affiche dans le ListView:
            '...Traitement de l'affichage dans le ListView
        End If
    Next X
Il faut aussi ajouter une gestion d'erreur car dans la boucle il y a des nodes qui n'ont pas de parents !

Si tu as défini ton ListView avec 2 colonnes (Adresse Valeur et Valeur associée), la recherche des enfants et l'affichage dans le ListView ressemblerait à ça:

Private Sub AfficheValeurs( ByVal NodeParent As String, myTV As TreeView, myLV As ListView)
Dim X As Long
Dim itmX As ListItem
    myLV.ListItems.Clear
    If NodeParent = vbNullString Then Exit Sub
    On Local Error GoTo ErrorAfficheValeurs 'Util au minimum dans le premier noeud car il n'a pas de parent!
    For X = 1 To myTV.Nodes.Count
        If myTV.Nodes(X).Parent = NodeParent Then
            '# Ce node est un enfant de NodeParent. On l'affiche dans le ListView:            Set itmX myLV.ListItems.Add(, , myTV.Nodes(X).Text) '1ère colonne AdresseValeur            itmX.SubItems(1) "Ma valeur ..." '2ème colonne Valeur associée
            '! Ou peut-être : itmX.SubItems(1) = myTV.Nodes(X).Tag '-> Si la valeur est mémo dans le tag par ex.
        End If
AfficheValeurs_NextNode:
    Next X
    On Local Error GoTo 0
   
    GoTo EndAfficheValeurs
ErrorAfficheValeurs:
    Resume AfficheValeurs_NextNode
EndAfficheValeurs:
End Sub

Et l'interception du click sur le TreeView serait:

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
    AfficheValeurs Node.Text, TreeView1, ListView1
End Sub

Pour le test, Ouvrir un nouveau projet, avec Form1 par défaut. Copier les 2 sub privées ci-dessus et ajouter:

Private Sub Form_Load()
    '# Version des contrôles utilisés:
    '-  TreeView et ListView : Microsoft Windows Common Controls 6.0 (SP6)
   
    '# Positions et dimensions des objets:    Form1.Width 8715: Form1.Height 4335    TreeView1.Width 2895: TreeView1.Height 2895        TreeView1.Left 120: TreeView1.Top 120    ListView1.Width 5295: ListView1.Height 2895        ListView1.Left 3120: ListView1.Top 120
       
    '# Initialisation de TreeView1:
Dim TopNode As Node, NodX As Node
    With TreeView1
        .LineStyle = tvwRootLines 'Affiche le '+' à gauche
        .Indentation = 250 'Décalage des enfants par rapport aux parents
        .LabelEdit = tvwManual 'Interdit la modification manuelle des noms des Nodes
        .Nodes.Clear
        .Sorted = True
        Set TopNode = .Nodes.Add(, , , "Nom automate1") 'Création d'un nouveau Parent
            Set NodX = .Nodes.Add(TopNode, tvwChild, , "AdresseValeur 1.1")
            Set NodX = .Nodes.Add(TopNode, tvwChild, , "AdresseValeur 1.2")
            Set NodX = .Nodes.Add(TopNode, tvwChild, , "AdresseValeur 1.3")
            Set NodX = .Nodes.Add(TopNode, tvwChild, , "AdresseValeur 1.4")
        Set TopNode = .Nodes.Add(, , , "Nom automate2") 'Création d'un nouveau Parent
            Set NodX = .Nodes.Add(TopNode, tvwChild, , "AdresseValeur 2.1")
            Set NodX = .Nodes.Add(TopNode, tvwChild, , "AdresseValeur 2.2")
            Set NodX = .Nodes.Add(TopNode, tvwChild, , "AdresseValeur 2.3")
            Set NodX = .Nodes.Add(TopNode, tvwChild, , "AdresseValeur 2.4")
        Set TopNode = .Nodes.Add(, , , "Nom automate3 (vide)") 'Création d'un nouveau Parent
    End With
   
    '# Initialisation du ListView1:
    With ListView1
        .View = lvwReport '(=3) Mode Détail avec plusieurs colonnes
        .FullRowSelect = True 'Sélectionne toute la ligne
        .LabelEdit = tvwManual 'Interdit la modification manuelle des lignes
        .ColumnHeaders.Clear 'Efface toutes les lignes
        .ColumnHeaders.Add , , "AdresseValeur", 2000 'Ajoute une nouvelle colonne
        .ColumnHeaders.Add , , "Valeur", 2000 'Ajoute une nouvelle colonne
    End With
End Sub

titicar
3
fredoo033 Messages postés 12 Date d'inscription mardi 25 mars 2008 Statut Membre Dernière intervention 7 juillet 2008
4 juil. 2008 à 09:31
Merci titicar pour ta réponse. Mais je ne vois pas comment je peut faire pour récupérer tous les noeud enfant du node sur lequel j'ai cliquer.
0
fredoo033 Messages postés 12 Date d'inscription mardi 25 mars 2008 Statut Membre Dernière intervention 7 juillet 2008
7 juil. 2008 à 09:19
Un grand merci à toi titicar ca fonctionne très bien. encore enorme merci à toi j'en demandé pas tant. 

 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
7 juil. 2008 à 18:50
Pas de quoi, ravis que ça puisse t'aider ;-)

titicar
0
Rejoignez-nous