IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

ListBox : Findstring "décalé"


Sujet :

Windows Forms

  1. #1
    Membre confirmé Avatar de Miles Raymond
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 189
    Par défaut ListBox : Findstring "décalé"
    Bonjour !

    J'admet que mon titre de sujet n'est pas très clair, laissez-moi vous expliquer mon petit soucis.

    J'ai une listbox avec la liste des clients d'une entreprise, au dessus de celle-ci se trouve un textbox de recherche. A chaque évenement keypress dans mon textbox, j'effectue une recherche de la chaine dans ma listbox et pointe sur le premier index contenant cette chaîne. C'est tout basique, voilà mon code sur l'évènement keypress :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub txtb_Search_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtb_Search.KeyPress
            lb_Clients.SelectedIndex = lb_Clients.FindString(txtb_Search.Text, 0)
            If txtb_Search.Text = "" Then
                lb_Clients.SelectedIndex = 0
            End If
        End Sub
    J'ajoute juste une petite ligne forçant le programme à resélectionner le premier index de ma listbox lorsque le textbox (txtb_Search) est vide.

    Seulement mon petit code fonctionne, mais avec un décalage. C'est à dir que si je recherche un Dunand il ne pointera pas tout de suite sur l'index de Dunand lorsque j'appuierai sur la touche d, mais uniquement lorsque j'aurai taper les touches du. Illustration :

    -->

    Ce n'est pas grave en sois, à la limite, l'utilisateur peut force la recherche en tapant sur Enter, mais je préfèrerais pouvoir mieux gérer cet évènement.

    J'ai essayer d'utiliser l'évènement KeyDown mais celui-ci fonctionne plus ou moins de la même manière, si ce n'est qu'il hésite un peu. En tapant d il sélectionne Dunand pendant une mili-seconde, puis pointe à nouveau sur le premier index...

    Une idée ?

    Merci !

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    dans l'évènement keypress, e.keychar contient la touche tapée et il est possible "d'annuler la frappe" en mettant e.keychar à ""

    pendant cet évènement la touche tapée n'a pas encore été ajoutée au textbox
    quand on tape "d" textbox contient "" donc tu cherche rien
    quand tu tape u pour avoir du textbox contient que d et tu cherche d

    il faut donc que tu déplaces ton code dans l'évènement textchanged
    (ou alors que tu cherche textbox.text & e.keychar)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    de plus, pour faire une recherche par frappe, il y a mieux niveau interface utilisateur, n'afficher que ce qu'il faut

    exemple au début au lieu de remplir ta listbox, tu remplis une collection

    ensuite sur textchanged :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    listbox.clear
    boucle sur la collection
      si textbox = "" then
         ajouter element coll à listbox
        else
         si element coll contient textbox ajouter element coll à listbox
       fin si
    fin boucle
    il y a encore mieux pour les faignant, surtout si les données de ta listbox viennent d'une base de données
    tu prend un objet datatable, rempli en 3 lignes en spécifiant la requete
    puis sur l'objet datatable tu peux faire
    listbox.clear
    datatable.select (nom like %" & textbox.text & "%)
    boucle sur le resultat du datatable
    puis remplir la list
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre confirmé Avatar de Miles Raymond
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 189
    Par défaut
    Citation Envoyé par sperot51 Voir le message
    dans l'évènement keypress, e.keychar contient la touche tapée et il est possible "d'annuler la frappe" en mettant e.keychar à ""

    pendant cet évènement la touche tapée n'a pas encore été ajoutée au textbox
    quand on tape "d" textbox contient "" donc tu cherche rien
    quand tu tape u pour avoir du textbox contient que d et tu cherche d

    il faut donc que tu déplaces ton code dans l'évènement textchanged
    (ou alors que tu cherche textbox.text & e.keychar)
    Je vais faire le test ce matin avec textchanged. J'avais pensé que c'était un comportement de ce genre, merci de me confirmé ça !

    Citation Envoyé par sperot51 Voir le message
    de plus, pour faire une recherche par frappe, il y a mieux niveau interface utilisateur, n'afficher que ce qu'il faut

    exemple au début au lieu de remplir ta listbox, tu remplis une collection

    ensuite sur textchanged :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    listbox.clear
    boucle sur la collection
      si textbox = "" then
         ajouter element coll à listbox
        else
         si element coll contient textbox ajouter element coll à listbox
       fin si
    fin boucle
    il y a encore mieux pour les faignant, surtout si les données de ta listbox viennent d'une base de données
    tu prend un objet datatable, rempli en 3 lignes en spécifiant la requete
    puis sur l'objet datatable tu peux faire
    listbox.clear
    datatable.select (nom like %" & textbox.text & "%)
    boucle sur le resultat du datatable
    puis remplir la list
    Merci beaucoup de tes précisions. Seulement la "recherche rapide" pointant sur une champ de la listbox c'est vraiment une petite fonction pour pointer rapidement sur l'élément qui nous intéresse. Le système de requête n'affichant que ce que l'utilisateur recherche, je l'ai déjà integré dans un système de recherche un peu plus avancé, avec possibilité de filtrer les infos ! Donc de ce côté là je suis blindé, c'était juste ce petit soucis du décalage qui me titillait un peu.

    Merci encore de tes réponses !

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo