fredoo033
Messages postés12Date d'inscriptionmardi 25 mars 2008StatutMembreDernière intervention 7 juillet 2008
-
3 juil. 2008 à 16:14
cs_titicar
Messages postés181Date d'inscriptionjeudi 30 mai 2002StatutMembreDernière intervention19 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.
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.
cs_titicar
Messages postés181Date d'inscriptionjeudi 30 mai 2002StatutMembreDernière intervention19 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.
cs_titicar
Messages postés181Date d'inscriptionjeudi 30 mai 2002StatutMembreDernière intervention19 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)
'# 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