Astuces de recherche...
Home
- Accueil & nouveautés
- Les newsgroups VB
- Téléchargements
- L'équipe
- Nous contacter
- Liens
Rubriques
- Toutes les questions
- Affichage & graphismes
- Algorithmique
- API
- Base de registre
- Bases de données
- Contrôles
- Date & heure
- Déploiement
- Divers
- Erreurs & problèmes
- Fichiers & dossiers
- Généralités
- Impression
- Internet & mails
- Math
- Multimédia
- Réseaux
- Structures de données
- Texte & strings
- VB .Net
- VB Script
- VBA
- Windows

Question 155

Comment rechercher rapidement un élément dans une ListBox ou un ComboBox ?

Pour trouver rapidement un élément dans une ListBox ou une ComboBox, pas d'autre choix avec les méthodes classiques que de parcourir un par un tous les éléments du contrôle. Ceci peut pourtant être bien utile, pour positionner automatiquement l'index de la ListBox ou de la ComboBox à une position voulue, en fonction par exemple des premières lettres du mot.

Il y a en revanche une solution très simple et très efficace pour réaliser cette recherche rapide, en utilisant la fonction SendMessage pour envoyer au contrôle le message approprié.

L'exemple suivant montre comment réaliser une telle fonction de recherche avec une ListBox. Il est très facile de faire de même avec une ComboBox, le fonctionnement étant 100% identique.

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
        ByVal hwnd As Long, ByVal wMsg As Long, _
        ByVal wParam As Long, lParam As Any) As Long

Private Const LB_FINDSTRINGEXACT As Long = &H1A2
Private Const LB_FINDSTRING As Long = &H18F
Private Const LB_ERR As Long = -1
'
' Entrées :
'  LstBox        : La ListBox dans laquelle on fait la recherche
'  searchPattern : La chaine de caractère recherchée
'  startIndex    : (optionnel) Index de départ de la recherche
'  exactMatch    : (optionnel) Si True,  la fonction recherche un item exactement égal à searchPattern
'                              Si False, la fonction recherche le premier item commençant par searchPattern
'
' Sortie :
'  retourne l'index dans la liste de la première occurrence de l'élément recherché
'  si rien n'est trouvé, la fonction retouren LB_ERR (-1)
'
Private Function SearchListBox(lstBox As ListBox, ByVal searchPattern As String, _
                               Optional ByVal startIndex As Long = -1, _
                               Optional ByVal exactMatch As Boolean = False) As Long
    Dim searchType As Long
     
    If exactMatch Then
        searchType = LB_FINDSTRINGEXACT
    Else
        searchType = LB_FINDSTRING
    End If
     
    SearchListBox = SendMessage(lstBox.hwnd, searchType, startIndex, ByVal searchPattern)
     
End Function

'
' Exemples d'utilisation
'     
    ' cherche le premier item de list1 commençant par MART
    result = SearchListBox(List1, "MART")
     
    ' cherche le premier item de List1 exactement égal à "MARTINE"
    result = SearchListBox(List1, "MARTINE", , True)
     
    ' cherche le premier item de List1 commençant par "PIER", à partir de l'index 10
    result = SearchListBox(List1, "PIER", 10)

Pour faire de même avec une ComboBox, il suffit d'utiliser les messages CB_FINDSTRING et CB_FINDSTRINGEXACT.

Pour aller plus loin

Voir aussi :

Date de publication : 25 février 2007
Dernière modification : 06 mars 2008
Rubriques : API, Contrôles
Mots-clés : ListBox, List Box, ComboBox, Combo Box, rechercher, recherche, rapide, messages, LB_FINDSTRING, LB_FINDSTRINGEXACT, optimisation, SendMessage, API