Search dans le résultat d'un treeview

cs_Bifrons Messages postés 44 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 17 septembre 2005 - 7 oct. 2003 à 13:43
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 7 oct. 2003 à 17:01
Voila j'ai un prog dans lequel j'utilise un treeview et que je "populate" depuis une base SQL.

Ce que je n'arrive pas à trouver et donc à faire, c'est de pouvoir faire un search dans ce treeview par exemple une inputbox s'ouvre et je tape un bout de texte et ca me le trouve (ensuite comme d'habitude F3 et search de la correspondance suivante)....

J'ai rien trouvé ici (ou alors c'est bien caché) malgré les 22 pages parcourues ... quelle patience :)

Merci aux futurs "répondeurs" soit de bien m'orienter (je débute en VB dans un petite entreprise) soit de me donner un bout de code à implémenter dans le mien (je sais trop facile, mais je m'en sors pas sur ce coup là)

8 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 oct. 2003 à 13:53
Bouges pas, je te code ca, et je reviens [;-)]

By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 oct. 2003 à 14:15
Voici une fonction qui te permetteras d'obtenir une liste des noeuds correspondant a tes critères.

Public Function SearchNodes(TV As TreeView, Str As String, Optional PartialText As Boolean True, Optional IgnoreCase As Boolean True) As Collection
    Dim mCol As New Collection
    Dim Node As Node
    For Each Node In TV.Nodes
        If PartialText Then
            If IgnoreCase Then
                If UCase$(Node.Text) Like "*" & UCase$(Str) & "*" Then mCol.Add Node
            Else
                If Node.Text Like "*" & Str & "*" Then mCol.Add Node
            End If
        Else
            If IgnoreCase Then
                If UCase$(Node.Text) = UCase$(Str) Then mCol.Add Node
            Else
                If Node.Text = Str Then mCol.Add Node
            End If
        End If
    Next Node
    Set SearchNodes = mCol
End Function


Voici une manieree possible de tester cela :

    Dim Node As Node
    For Each Node In SearchNodes(TV, InputBox("Entrez un morceau de la chaîne a rechercher."))
        MsgBox Node.Text
    Next Node


Bien sur, cela est assez loin de ce que tu souhaite finalement obtenir, mais tu peux sans doute tenter de l'implémenter.....

By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
0
cs_Bifrons Messages postés 44 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 17 septembre 2005
7 oct. 2003 à 14:51
OKI merci pour ta réponse rapide lol

Je l'ai implémenté mais ........

J'ai mis un STOP ici => For Each Node In TV.Nodes pour voir la valeur du Node.

lorsque j'exécute, et que je fais un search, l'Input box vient (normal) je saisi le texte a rechercher et je valide

Je pointe sur Node et ...... Node = Nothing pourtant la valeur recherchée (le texte) existe dans le treeview

Ya un blême ... mais ou (ou alors mes connaissances s'arrêtent ou les tiennes commencent) :)

....
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 oct. 2003 à 15:01
dqns lq boucle For Eqch Node in...

le texte recherche n'est pas considéré...
seuls sont enumeres les noeuds. ton treeview serait-il vide ??

essaie de mettre ca dans un nouvelle feuille, contenant un treeview appele TV

Option Explicit

Private Sub Form_Load()
    TV.Nodes.Add Key:="Verbes", Text:="Verbes"
    TV.Nodes.Add "Verbes", tvwChild, Text:="Construire"
    TV.Nodes.Add "Verbes", tvwChild, Text:="Courir"
    TV.Nodes.Add "Verbes", tvwChild, Text:="Bondir"
    
    Dim Node As Node
    MsgBox "Recherche des verbes contenant ""on"""
    For Each Node In SearchNodes(TV, "on")
    MsgBox Node.Text
    Next Node
End Sub
Public Function SearchNodes(TV As TreeView, Str As String, Optional PartialText As Boolean True, Optional IgnoreCase As Boolean True) As Collection
Dim mCol As New Collection
Dim Node As Node
For Each Node In TV.Nodes
If PartialText Then
If IgnoreCase Then
If UCase$(Node.Text) Like "*" & UCase$(Str) & "*" Then mCol.Add Node
Else
If Node.Text Like "*" & Str & "*" Then mCol.Add Node
End If
Else
If IgnoreCase Then
If UCase$(Node.Text) = UCase$(Str) Then mCol.Add Node
Else
If Node.Text = Str Then mCol.Add Node
End If
End If
Next Node
Set SearchNodes = mCol
End Function



By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
0

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

Posez votre question
cs_Bifrons Messages postés 44 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 17 septembre 2005
7 oct. 2003 à 15:45
Non ya des infos .. et assez en +

Le bug est trouvé (si je peux me permettre de l'appeler comme ca) ..

C'est c .. mets si tu fais une recherche dès le RUN dans un noeud contenant Michel si le noeud parent n'a jamais été ouvert, il ne trouve rien. Par contre si j'ouvre et je ferme le noeud ou se trouve Michel et que je reviens à la racine du tree faire un search et bien il le trouve => étonnant !!

J'ai testé ca sur plusieurs enregistrements dans des noeuds différents et ca me fait la meme chose !

Faudrait-il faire ou forcer un expand ? ou autre chose ... à modifier dans le code

...
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 oct. 2003 à 16:13
Je me doutais que ca tirait vers la...
ton TV est-il allimenté completement dès le depart, ou seulement quand j'EXPAND les noeuds ??

parce que j'avais fais une procedure recursive, mais ca c'est averé inutile : tous mes noeuds sont trouvés systematiquement, independamment de la profondeur ou il est situe, sans avoir a se préoccupper de savoir si j'ai ouvert le noeud parent ou non.....

un probleme se pose si ton TV est alimenté au fur et a mesure de l'ouverture de tes noeuds.

By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
0
cs_Bifrons Messages postés 44 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 17 septembre 2005
7 oct. 2003 à 16:55
Carton : t'as gagné c'est exactement ça !!! miel

Les noeuds sont alimentés "à la demande" meme la racine ...

Donc si je t'ai bien compris, ta soluce ne va pas pour ça (autre info c'est une future appli prof. et destinée à recevoir énormément d'infos).

Ne serait-il pas possible de "peupler" le tree lors de la recherche ou cela alourdirait trop l'appli ? (j'en sais rien en faite mais je pense que oui) ?

Ou alors une autre idée (arrête moi si je te saoule !!) faire un search directement dans la base de données SQL en rapport avec l'index donné par le tree) car en principe on fait une recherche en raport à là ou on se trouve ?

...
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 oct. 2003 à 17:01
Tu as tout compris !!
alimenter le TV a la recherche serait trop long , vraiment !

il faudrait donc bel et bien effectuer ta recherche dans la bdd directement...

By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
0
Rejoignez-nous