OVH Cloud OVH Cloud

REP a Zoury

14 réponses
Avatar
JCM
Salut ZOURY

je t'ai joins ma table access in piece jointe, car cela
beug toujours avec le TreeView. as-tu pu regarder le
probleme

Cordialement
JCM

10 réponses

1 2
Avatar
Zoury
Salut Jean-Claude! :O)

je t'ai joins ma table access in piece jointe, car cela



où ça, je ne vois aucune pièce jointe ? :OP

beug toujours avec le TreeView. as-tu pu regarder le
probleme



As-tu lu ma dernière réponse concernant ton problème ?

voir :
http://groups.google.com/groups?threadm-c9a01c46a31%240aacb910%24a301280a%40phx.gbl


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
JCM
Salut ZOURY

Voila ce que je voudrais obtenir :

+- ALIMENTAIRE
| |
| +- Pain patisserie fraiche
| | |
| | +- Pain
| | +- Patisserie fraiche
| |
| +-Viandes volailles charcuterie
| | |
| | +- charcuterie conserve de viande
| +- viandes
|
+- EQUIPEMENT DE LA PERSONNE
|
+-
+-
+-


A partir des éléments joints dans le ZIP
Cordialement
Jean Claude
-----Message d'origine-----
Salut Jean-Claude! :O)

je t'ai joins ma table access in piece jointe, car cela



où ça, je ne vois aucune pièce jointe ? :OP

beug toujours avec le TreeView. as-tu pu regarder le
probleme



As-tu lu ma dernière réponse concernant ton problème ?

voir :
http://groups.google.com/groups?threadm-c9a01c46a31%


240aacb910%24a301280a%40phx.gbl


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 -


http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -


http://www.mztools.com/


.



Avatar
Zoury
Salut Jean-Claude! :O)

L'algorithme varient légèrement de ce que j'en avais compris (à cause du
"libelle" en fait), remplace le code suivant :
'***
If (sTypeValue > sOldTypeValue) Then
Set nodX = TreeView1.Nodes.Add(, , sTypeKey, nTypeValue)
sOldSousTypeValue = ""
End If
If (sSousTypeValue > sOldSousTypeValue) Then
Set nodX = TreeView1.Nodes.Add(sTypeKey, tvwChild, sSousTypeKey,
nTypeValue)
End If
Set nodX = TreeView1.Nodes.Add(sSousTypeKey, tvwChild,
sSousSousTypeKey, nTypeValue)
'***

par :
'***
If (sTypeValue > sOldTypeValue) Then
Set nodX = TreeView1.Nodes.Add(, , sTypeKey, nTypeValue)
sOldSousTypeValue = ""
ElseIf (sSousTypeValue > sOldSousTypeValue) Then
Set nodX = TreeView1.Nodes.Add(sTypeKey, tvwChild, sSousTypeKey,
nTypeValue)
Else
Set nodX = TreeView1.Nodes.Add(sSousTypeKey, tvwChild,
sSousSousTypeKey, nTypeValue)
End If
'***

Ce qui fait qu'un seul noeud ne sera ajouter par tour ... Dans l'ancien
algorithme, je vérifie si le parent et grand-parent du noeud existe avant de
l'ajouter, sinon je les ajoute. Tu te retrouvais donc avec le même noeud
(meme libelle) trois fois de suite.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
"JCM" a écrit dans le message de
news:073201c46e4f$291e9b80$
Salut ZOURY

Voila ce que je voudrais obtenir :

+- ALIMENTAIRE
| |
| +- Pain patisserie fraiche
| | |
| | +- Pain
| | +- Patisserie fraiche
| |
| +-Viandes volailles charcuterie
| | |
| | +- charcuterie conserve de viande
| +- viandes
|
+- EQUIPEMENT DE LA PERSONNE
|
+-
+-
+-


A partir des éléments joints dans le ZIP
Cordialement
Jean Claude
-----Message d'origine-----
Salut Jean-Claude! :O)

je t'ai joins ma table access in piece jointe, car cela



où ça, je ne vois aucune pièce jointe ? :OP

beug toujours avec le TreeView. as-tu pu regarder le
probleme



As-tu lu ma dernière réponse concernant ton problème ?

voir :
http://groups.google.com/groups?threadm-c9a01c46a31%


240aacb910%24a301280a%40phx.gbl


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 -


http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -


http://www.mztools.com/


.



Avatar
Zoury
et j'allais oublié, dans ton code tu as
'***
"Select * from depenseACFCI2002" & " order by IDdepense"
'***

je ne sais pas si l'erreur existe seulement dans l'exemple que tu m'as
posté,
mais je te recommande d'éviter la concaténation inutile :
'***
"Select * from depenseACFCI2002 order by IDdepense"
'***

et de lister les champs que tu as besoin dans le select
'***
"Select IDdepense, libelle from depenseACFCI2002 order by IDdepense"
'***

ce ne sont que de bonnes pratiques... ;O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
JCM
Salut ZOURY

Merci pour ta réponse cela fonctionne néanmoins quand je
lance l'appli, le curseur se positionne sur le bas de
l'algorithme, comment le positionner tout au début ?

et pour profiter de ton savoir,

j'ai ajouté des cases à cocher :

'affichage des checkBox
TreeView1.LabelEdit = tvwManual
TreeView1.Style = tvwTreelinesText ' Style 4.
TreeView1.BorderStyle = vbFixedSingle
CurStyle = GetWindowLong(TreeView1.hwnd, GWL_STYLE)
Result = SetWindowLong(TreeView1.hwnd, GWL_STYLE,
CurStyle Or TVS_CHECKBOXES)

le problème c'est que si je coche la case d'un sous-type
du premier type, pas de problème, mais si je coche une
seconde case sur un sous-type du deuxième type cela beug
avec le message "variable objet ou variable bloc with non
définie"

Private Sub TreeView1_NodeClick(ByVal Node As Node)
Dim n As Integer
' Variable pour information.
Dim strParents As String
' Affecte à n la valeur d'index du noud sélectionné.
n = Node.Index
strParents = Node.Text & vbLf
While n <> Node.Root.Index
strParents = strParents & TreeView1.Nodes
(n).Parent.Text & vbLf
' Affecte à n la valeur d'index de l'objet Node
parent parent qui suit.
n = TreeView1.Nodes(n).Parent.Index
Wend
MsgBox strParents
End Sub

D'autre part je voudrais :

1- quand je coche un sous-type que cela coche
automatiquement les sous-sous-types de ce type, est-ce
possible ?

2- quand j'ai coché les cases concernées, à partie d'un
bouton "OK" récupérer les libellés de celles-ci

Après cela je ne devrais plus abuser de tes connaissances

Merci de tes réponses
Cordialement
Jean Claude

-----Message d'origine-----
Salut Jean-Claude! :O)

L'algorithme varient légèrement de ce que j'en avais


compris (à cause du
"libelle" en fait), remplace le code suivant :
'***
If (sTypeValue > sOldTypeValue) Then
Set nodX = TreeView1.Nodes.Add(, , sTypeKey,


nTypeValue)
sOldSousTypeValue = ""
End If
If (sSousTypeValue > sOldSousTypeValue) Then
Set nodX = TreeView1.Nodes.Add(sTypeKey,


tvwChild, sSousTypeKey,
nTypeValue)
End If
Set nodX = TreeView1.Nodes.Add(sSousTypeKey,


tvwChild,
sSousSousTypeKey, nTypeValue)
'***

par :
'***
If (sTypeValue > sOldTypeValue) Then
Set nodX = TreeView1.Nodes.Add(, , sTypeKey,


nTypeValue)
sOldSousTypeValue = ""
ElseIf (sSousTypeValue > sOldSousTypeValue) Then
Set nodX = TreeView1.Nodes.Add(sTypeKey,


tvwChild, sSousTypeKey,
nTypeValue)
Else
Set nodX = TreeView1.Nodes.Add(sSousTypeKey,


tvwChild,
sSousSousTypeKey, nTypeValue)
End If
'***

Ce qui fait qu'un seul noeud ne sera ajouter par tour ...


Dans l'ancien
algorithme, je vérifie si le parent et grand-parent du


noeud existe avant de
l'ajouter, sinon je les ajoute. Tu te retrouvais donc


avec le même noeud
(meme libelle) trois fois de suite.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 -


http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -


http://www.mztools.com/
"JCM" a écrit dans le


message de
news:073201c46e4f$291e9b80$
Salut ZOURY

Voila ce que je voudrais obtenir :

+- ALIMENTAIRE
| |
| +- Pain patisserie fraiche
| | |
| | +- Pain
| | +- Patisserie fraiche
| |
| +-Viandes volailles charcuterie
| | |
| | +- charcuterie conserve de viande
| +- viandes
|
+- EQUIPEMENT DE LA PERSONNE
|
+-
+-
+-


A partir des éléments joints dans le ZIP
Cordialement
Jean Claude
-----Message d'origine-----
Salut Jean-Claude! :O)

je t'ai joins ma table access in piece jointe, car cela



où ça, je ne vois aucune pièce jointe ? :OP

beug toujours avec le TreeView. as-tu pu regarder le
probleme



As-tu lu ma dernière réponse concernant ton problème ?

voir :
http://groups.google.com/groups?threadm-c9a01c46a31%


240aacb910%24a301280a%40phx.gbl


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 -


http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -


http://www.mztools.com/


.





.



Avatar
Zoury
> Merci pour ta réponse cela fonctionne néanmoins quand je
lance l'appli, le curseur se positionne sur le bas de
l'algorithme, comment le positionner tout au début ?



"sur le bas de l'algorithme" <- tu veux dire que le dernier noeud de
l'arbre est sélectionné ou afficher ?
si oui, c'est à dû à cette ligne :
'***
nodX.EnsureVisible ' Affiche tous les nouds
'***
EnsureVisible n'affiche pas tous les noeuds, mais rend celui appelant la
fonction visible dans la fenêtre du Treeview. Pour laisser le "focus" dans
le haut de la liste, tu n'as qu'a enlèver cette ligne.



j'ai ajouté des cases à cocher :
CurStyle = GetWindowLong(TreeView1.hwnd, GWL_STYLE)
Result = SetWindowLong(TreeView1.hwnd, _
GWL_STYLE, CurStyle Or TVS_CHECKBOXES)



Pourquoi ne pas simplement utiliser TreeView1.CheckBoxes = True ? :O)

le problème c'est que


<snip>
avec le message "variable objet ou variable bloc with non
définie"


<snip>
n = Node.Index
While n <> Node.Root.Index


<snip>
n = TreeView1.Nodes(n).Parent.Index



Ton algorithme n'est pas correct. Tu ne peux pas te fier à l'index d'un
noeud pour déterminer sa position dans l'arbre. L'index 3 ne vient pas
nécessairement après le noeud ayant l'index 2... et même s'il venait après,
tu ne pourrais prendre pour acquis que le noeud ayant l'index 3 est sur le
même niveau que le 2. Les Index sont assignés selon l'ordre de création des
noeuds dans l'arbre et non selon leur position dans celui -ci... je te
montre comment dans le prochain point.

1- quand je coche un sous-type que cela coche
automatiquement les sous-sous-types de ce type, est-ce
possible ?



exemple, utilise l'événement NodeCheck au lieu de NodeClick, car le dernier
se déclenche à *chaque* clique sur Node :
'***
' coche les noeuds récursivement
Private Sub TreeView1_NodeCheck(ByVal Node As MSComctlLib.Node)
Call CheckNode(Node, Node.Checked, True)
End Sub

Private Sub CheckNode(ByRef Node As MSComctlLib.Node, ByRef bChecked As
Boolean, Optional ByRef bRecursive As Boolean)

Dim nd As MSComctlLib.Node

' on coche le noeud courant
Node.Checked = bChecked

' on vérifie s'il a des p'tits
' et si on doit s'en préoccuper
If (bRecursive And Node.Children > 0) Then
' il a des p'tits, on rappelle
' la fonction sur chacun d'eux
Set nd = Node.Child ' renvoit le premier noeud du sous-niveau
Do Until nd Is Nothing
Call CheckNode(nd, bChecked, bRecursive)
Set nd = nd.Next ' renvoit le prochain noeud du meme niveau
Loop
End If

End Sub
'***

2- quand j'ai coché les cases concernées, à partie d'un
bouton "OK" récupérer les libellés de celles-ci

l'algorithme, seulement cette fois du commence à partir du premier noeud de
l'arbre et tu vérifies la propriété Checked des noeuds que tu parcours.
'***
Private Sub PrintSelectedNodesCaptionRecursive(ByRef Node As
MSComctlLib.Node)

Dim nd As MSComctlLib.Node

' on vérifie si le noeud est coché,
' si oui on print
If (Node.Checked) Then
Debug.Print Node.FullPath
End If

' on vérifie s'il a des p'tits
If (Node.Children > 0) Then
' il a des p'tits, on rappelle
' la fonction sur chacun d'eux
Set nd = Node.Child ' renvoit le premier noeud du sous-niveau
Do Until nd Is Nothing
Call PrintSelectedNodesCaptionRecursive(nd)
Set nd = nd.Next ' renvoit le prochain noeud du meme niveau
Loop
End If

End Sub

Private Sub PrintSelectedNodesCaption(Optional ByVal Node As
MSComctlLib.Node)

Dim nd As MSComctlLib.Node

' si Node n'est pas spécifié on
' prend le premier de l'arbre
If (Node Is Nothing) Then
' Note que selon le code impliqué,
' rien ne garantit que Nodes(0)
' existe dans un treeview car il a peut-être
' été supprimé. il faut donc faire les validations
' nécessaire c'est un cas possible dans le programme..
'
' en régle générale, on prend n'importe quel noeud de l'arbre
' et on va chercher le FirstSibling du Root d'un noeud afin
' d'ontenir le premier noeud de l'arbre.
'
' Notes :
' FirstSibling : premier noeud d'un meme niveau
' Root : noeud le plus élévé dans le hierarchie
'
Set Node = TreeView1.Nodes(1).Root.FirstSibling
End If

' on boucle parmit les autres du niveau
Do Until Node Is Nothing
Call PrintSelectedNodesCaptionRecurse(Node)
Set Node = Node.Next ' on passe au prochain
Loop

End Sub

Private Sub Command1_Click()
Call PrintSelectedNodesCaption
End Sub
'***

Merci de tes réponses



Ça me fait plaisir! :O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Zoury
> ' Note que selon le code impliqué,
' rien ne garantit que Nodes(0)
' existe dans un treeview car il a peut-être



il faut plutôt lire Nodes(1) car l'index des noeuds débute à 1 dans la
collection.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
JCM
salut ZOURY

Encore merci pour ton aide, mais j'ai encore les problèmes
suivants :

quand je lance l'appli, le treeview affiche le bas de
l'algorithme, je suis obligé de remonter l'ascenseur pour
me placer sur le premier type "alimentaire"
si je supprime nodx.ensureVisible je n'ai plus la
possibilité de développer l'algorithme.

pour tester la récuperation des checkBox cochées j'ai
ajouté :

If (Node.Checked) Then
Debug.Print Node.FullPath
'affiche la sélection
MsgBox Node.FullPath
End If

le problème c'est qu'il me faut appuyer successivement sur
le OK de la msgBox pour avoir le résultat

En fait ce que je veux faire c'est avec command1_click :
je créé une nouvelle table de dépenses dans laquelle
j'ajouterai les enregistrements de la table initiale
cochés dans le treeview.

LE TOP pour mon appli, ce serait que je puisses également
ajouter à mon treeview un listview d'une colonne pour
affiché le montant (champ "montant" de la table access) de
la dépense correspondant au type, sous-type,...
Encore merci
Cordialement
Jean claude

-----Message d'origine-----
Merci pour ta réponse cela fonctionne néanmoins quand je
lance l'appli, le curseur se positionne sur le bas de
l'algorithme, comment le positionner tout au début ?



"sur le bas de l'algorithme" <- tu veux dire que le


dernier noeud de
l'arbre est sélectionné ou afficher ?
si oui, c'est à dû à cette ligne :
'***
nodX.EnsureVisible ' Affiche tous les nouds
'***
EnsureVisible n'affiche pas tous les noeuds, mais rend


celui appelant la
fonction visible dans la fenêtre du Treeview. Pour


laisser le "focus" dans
le haut de la liste, tu n'as qu'a enlèver cette ligne.



j'ai ajouté des cases à cocher :
CurStyle = GetWindowLong(TreeView1.hwnd,




GWL_STYLE)
Result = SetWindowLong(TreeView1.hwnd, _
GWL_STYLE, CurStyle Or TVS_CHECKBOXES)



Pourquoi ne pas simplement utiliser TreeView1.CheckBoxes


= True ? :O)

le problème c'est que


<snip>
avec le message "variable objet ou variable bloc with




non
définie"


<snip>
n = Node.Index
While n <> Node.Root.Index


<snip>
n = TreeView1.Nodes(n).Parent.Index



Ton algorithme n'est pas correct. Tu ne peux pas te fier


à l'index d'un
noeud pour déterminer sa position dans l'arbre. L'index 3


ne vient pas
nécessairement après le noeud ayant l'index 2... et même


s'il venait après,
tu ne pourrais prendre pour acquis que le noeud ayant


l'index 3 est sur le
même niveau que le 2. Les Index sont assignés selon


l'ordre de création des
noeuds dans l'arbre et non selon leur position dans


celui -ci... je te
montre comment dans le prochain point.

1- quand je coche un sous-type que cela coche
automatiquement les sous-sous-types de ce type, est-ce
possible ?



exemple, utilise l'événement NodeCheck au lieu de


NodeClick, car le dernier
se déclenche à *chaque* clique sur Node :
'***
' coche les noeuds récursivement
Private Sub TreeView1_NodeCheck(ByVal Node As


MSComctlLib.Node)
Call CheckNode(Node, Node.Checked, True)
End Sub

Private Sub CheckNode(ByRef Node As MSComctlLib.Node,


ByRef bChecked As
Boolean, Optional ByRef bRecursive As Boolean)

Dim nd As MSComctlLib.Node

' on coche le noeud courant
Node.Checked = bChecked

' on vérifie s'il a des p'tits
' et si on doit s'en préoccuper
If (bRecursive And Node.Children > 0) Then
' il a des p'tits, on rappelle
' la fonction sur chacun d'eux
Set nd = Node.Child ' renvoit le premier noeud du


sous-niveau
Do Until nd Is Nothing
Call CheckNode(nd, bChecked, bRecursive)
Set nd = nd.Next ' renvoit le prochain noeud


du meme niveau
Loop
End If

End Sub
'***

2- quand j'ai coché les cases concernées, à partie d'un
bouton "OK" récupérer les libellés de celles-ci

l'algorithme, seulement cette fois du commence à partir


du premier noeud de
l'arbre et tu vérifies la propriété Checked des noeuds


que tu parcours.
'***
Private Sub PrintSelectedNodesCaptionRecursive(ByRef Node


As
MSComctlLib.Node)

Dim nd As MSComctlLib.Node

' on vérifie si le noeud est coché,
' si oui on print
If (Node.Checked) Then
Debug.Print Node.FullPath
End If

' on vérifie s'il a des p'tits
If (Node.Children > 0) Then
' il a des p'tits, on rappelle
' la fonction sur chacun d'eux
Set nd = Node.Child ' renvoit le premier noeud du


sous-niveau
Do Until nd Is Nothing
Call PrintSelectedNodesCaptionRecursive(nd)
Set nd = nd.Next ' renvoit le prochain noeud


du meme niveau
Loop
End If

End Sub

Private Sub PrintSelectedNodesCaption(Optional ByVal Node


As
MSComctlLib.Node)

Dim nd As MSComctlLib.Node

' si Node n'est pas spécifié on
' prend le premier de l'arbre
If (Node Is Nothing) Then
' Note que selon le code impliqué,
' rien ne garantit que Nodes(0)
' existe dans un treeview car il a peut-être
' été supprimé. il faut donc faire les


validations
' nécessaire c'est un cas possible dans le


programme..
'
' en régle générale, on prend n'importe quel


noeud de l'arbre
' et on va chercher le FirstSibling du Root


d'un noeud afin
' d'ontenir le premier noeud de l'arbre.
'
' Notes :
' FirstSibling : premier noeud d'un meme niveau
' Root : noeud le plus élévé dans le hierarchie
'
Set Node = TreeView1.Nodes(1).Root.FirstSibling
End If

' on boucle parmit les autres du niveau
Do Until Node Is Nothing
Call PrintSelectedNodesCaptionRecurse(Node)
Set Node = Node.Next ' on passe au prochain
Loop

End Sub

Private Sub Command1_Click()
Call PrintSelectedNodesCaption
End Sub
'***

Merci de tes réponses



Ça me fait plaisir! :O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 -


http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -


http://www.mztools.com/


.



Avatar
Zoury
reBonjour! :O)

si je supprime nodx.ensureVisible je n'ai plus la
possibilité de développer l'algorithme.



Regarde du côté de la propriété Expanded d'un noeud. Si, par exemple, tu
voulais déployer tous les noeuds du premier niveau, tu pourrais modifier
légèrement la partie de code servant à remplir le treeview afin d'ouvrir les
noeuds dès leur ajoût au TreeView :
'***
If (sTypeValue > sOldTypeValue) Then


' ajoute le noeud parent et le déploie du même coup.
TreeView1.Nodes.Add(, , sTypeKey, nTypeValue).Expanded = True


sOldSousTypeValue = ""
ElseIf (sSousTypeValue > sOldSousTypeValue) Then
Call TreeView1.Nodes.Add(sTypeKey, tvwChild, sSousTypeKey,
nTypeValue)
Else
Call TreeView1.Nodes.Add(sSousTypeKey, tvwChild,
sSousSousTypeKey, nTypeValue)
End If
'***


Debug.Print Node.FullPath
'affiche la sélection
MsgBox Node.FullPath
le problème c'est qu'il me faut appuyer successivement sur
le OK de la msgBox pour avoir le résultat



Si tu as VB 6, Debug.Print envoi la chaine de caractère dans la "fenêtre
exécution" (Ctrl-G).
Si tu as VB 5, tu peux envoyer la chaine directement sur le formulaire (ou
meme dans un picturebox créer à cet effet), comme ceci :
'***
' on met ceci dans le form_load
Me.AutoRedraw = True
' et on écrit comme ceci
Me.Print Node.FullPath
'***

En fait ce que je veux faire c'est avec command1_click :
je créé une nouvelle table de dépenses dans laquelle
j'ajouterai les enregistrements de la table initiale
cochés dans le treeview.



Tu pourrais stocker le ID réel de l'enregistrement dans la propriété Tag de
chaque noeud :
'***
Dim nd As MSComctlLib.Node

If (sTypeValue > sOldTypeValue) Then
' ajoute le noeud parent et le déploie du même coup.
Set nd = TreeView1.Nodes.Add(, , sTypeKey, nTypeValue)
nd.Expanded = True
nd.Tag = sValue ' sValue contient IDdepense
sOldSousTypeValue = ""
ElseIf (sSousTypeValue > sOldSousTypeValue) Then
TreeView1.Nodes.Add(sTypeKey, tvwChild, sSousTypeKey,
nTypeValue).Tag = sValue
Else
TreeView1.Nodes.Add(sSousTypeKey, tvwChild, sSousSousTypeKey,
nTypeValue).Tag = sValue
End If
'***

Ensuite tu peux faire un fonction (ou modifier PrintSelectedNodesCaption()
et PrintSelectedNodesCaptionRecurse()) afin de faire des "insert into" dans
l'autre table..

quelque chose comme :
'***
Private Sub TransfertRecord(ByRef sIDdepense As String)
' code pour transferré l'emregistrement ici
End Sub

Private Sub PrintSelectedNodesCaptionRecurse(ByRef Node As MSComctlLib.Node)

Dim nd As MSComctlLib.Node

' on vérifie si le noeud est coché,
' si oui on print
If (Node.Checked) Then
' on suppose que la table existe déjà..
Call TransfertRecord(Node.Tag)
End If

' on vérifie s'il a des p'tits
If (Node.Children > 0) Then
' il a des p'tits, on rappelle
' la fonction sur chacun d'eux
Set nd = Node.Child ' renvoit le premier noeud du sous-niveau
Do Until nd Is Nothing
Call PrintSelectedNodesCaptionRecurse(nd)
Set nd = nd.Next ' renvoit le prochain noeud du meme niveau
Loop
End If

End Sub
'***


LE TOP pour mon appli, ce serait que je puisses également
ajouter à mon treeview un listview d'une colonne pour
affiché le montant (champ "montant" de la table access) de
la dépense correspondant au type, sous-type,...



Et si tu l'affichais à la suite du nom du nom du noeud ? tu n'aurais qu'à
ajouter le champs dans ton "select" et à concaténer le montant lors de la
création du nom ...


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
JCM
Re bonjour

Désolé Zoury mais j'ai toujours des problémes, j'ai fait
les modifs :

If (sTypeValue > sOldTypeValue) Then
Set nodX = TreeView1.Nodes.Add(, , sTypeKey,
nTypeValue)
'Set montant = ListView1.ListItems.Add(, , CStr
(ADOrst!montant))
nodX.Expanded = True
nodX.Tag = sValue ' sValue contient IDdepense
sOldSousTypeValue = ""
Set itmX = ListView1.ListItems.Add(, , CStr
(ADOrst!montant))

le montant s'affiche dans le listview, mais il n'y pas de
lien entre celui-ci et le treeview, je m'explique si je
monte l'ascenseur du treeView cela ne monte pas celui du
ListView ce qui rend la lecture difficile

Pour enregistrer les enregistrements d'une table à
l'autre :
Dim tblModele As String
tblModele = "LIDL"

Private Sub Command1_Click()
Call TransfertRecord
End Sub
Private Sub TransfertRecord(ByRef sIDdepense As String)
'enregistre la depense dans la table tblModele
Call ADOcnPC.Execute("insert into " & tblModele
& "(OrdreIDC, IDdepense, libelle, montant) values (ADOrst
(OrdreIDC, IDdepense, libelle, montant)")
End Sub

Je pense que l'insert into est mauvaise car cela beug sur
Call TransfertRecord

Qu'en penses-tu ?

Cordialement
Jean Claude
-----Message d'origine-----
reBonjour! :O)

si je supprime nodx.ensureVisible je n'ai plus la
possibilité de développer l'algorithme.



Regarde du côté de la propriété Expanded d'un noeud. Si,


par exemple, tu
voulais déployer tous les noeuds du premier niveau, tu


pourrais modifier
légèrement la partie de code servant à remplir le


treeview afin d'ouvrir les
noeuds dès leur ajoût au TreeView :
'***
If (sTypeValue > sOldTypeValue) Then


' ajoute le noeud parent et le déploie du


même coup.
TreeView1.Nodes.Add(, , sTypeKey,


nTypeValue).Expanded = True


sOldSousTypeValue = ""
ElseIf (sSousTypeValue > sOldSousTypeValue) Then
Call TreeView1.Nodes.Add(sTypeKey, tvwChild,


sSousTypeKey,
nTypeValue)
Else
Call TreeView1.Nodes.Add(sSousTypeKey,


tvwChild,
sSousSousTypeKey, nTypeValue)
End If
'***


Debug.Print Node.FullPath
'affiche la sélection
MsgBox Node.FullPath
le problème c'est qu'il me faut appuyer successivement




sur
le OK de la msgBox pour avoir le résultat



Si tu as VB 6, Debug.Print envoi la chaine de caractère


dans la "fenêtre
exécution" (Ctrl-G).
Si tu as VB 5, tu peux envoyer la chaine directement sur


le formulaire (ou
meme dans un picturebox créer à cet effet), comme ceci :
'***
' on met ceci dans le form_load
Me.AutoRedraw = True
' et on écrit comme ceci
Me.Print Node.FullPath
'***

En fait ce que je veux faire c'est avec command1_click :
je créé une nouvelle table de dépenses dans laquelle
j'ajouterai les enregistrements de la table initiale
cochés dans le treeview.



Tu pourrais stocker le ID réel de l'enregistrement dans


la propriété Tag de
chaque noeud :
'***
Dim nd As MSComctlLib.Node

If (sTypeValue > sOldTypeValue) Then
' ajoute le noeud parent et le déploie du


même coup.
Set nd = TreeView1.Nodes.Add(, , sTypeKey,


nTypeValue)
nd.Expanded = True
nd.Tag = sValue ' sValue contient IDdepense
sOldSousTypeValue = ""
ElseIf (sSousTypeValue > sOldSousTypeValue) Then
TreeView1.Nodes.Add(sTypeKey, tvwChild,


sSousTypeKey,
nTypeValue).Tag = sValue
Else
TreeView1.Nodes.Add(sSousTypeKey, tvwChild,


sSousSousTypeKey,
nTypeValue).Tag = sValue
End If
'***

Ensuite tu peux faire un fonction (ou modifier


PrintSelectedNodesCaption()
et PrintSelectedNodesCaptionRecurse()) afin de faire


des "insert into" dans
l'autre table..

quelque chose comme :
'***
Private Sub TransfertRecord(ByRef sIDdepense As String)
' code pour transferré l'emregistrement ici
End Sub

Private Sub PrintSelectedNodesCaptionRecurse(ByRef Node


As MSComctlLib.Node)

Dim nd As MSComctlLib.Node

' on vérifie si le noeud est coché,
' si oui on print
If (Node.Checked) Then
' on suppose que la table existe déjà..
Call TransfertRecord(Node.Tag)
End If

' on vérifie s'il a des p'tits
If (Node.Children > 0) Then
' il a des p'tits, on rappelle
' la fonction sur chacun d'eux
Set nd = Node.Child ' renvoit le premier noeud du


sous-niveau
Do Until nd Is Nothing
Call PrintSelectedNodesCaptionRecurse(nd)
Set nd = nd.Next ' renvoit le prochain noeud


du meme niveau
Loop
End If

End Sub
'***


LE TOP pour mon appli, ce serait que je puisses




également
ajouter à mon treeview un listview d'une colonne pour
affiché le montant (champ "montant" de la table access)




de
la dépense correspondant au type, sous-type,...



Et si tu l'affichais à la suite du nom du nom du noeud ?


tu n'aurais qu'à
ajouter le champs dans ton "select" et à concaténer le


montant lors de la
création du nom ...


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 -


http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -


http://www.mztools.com/


.



1 2