Sélection par le clavier dans une combobox en mode Dropdownlist [Résolu]

EISDCC 12 Messages postés mardi 3 août 2004Date d'inscription 14 mai 2013 Dernière intervention - 19 mars 2013 à 11:59 - Dernière réponse : EISDCC 12 Messages postés mardi 3 août 2004Date d'inscription 14 mai 2013 Dernière intervention
- 21 mars 2013 à 12:13
Bonjour,
J'ai écrit en VB.net un logiciel pour un de mes client, dans lequel il peut sélectionner un de ses prospects dans une liste de type Combobox, en mode Dropdownlist. Cette liste comporte plus de 3000 items. Le client utilise donc le clavier pour se positionner rapidement dans la liste. Cependant, si sa saisie n'est pas assez rapide - et c'est souvent le cas - la sélection devient difficile.
Exemple pour trouver DUPONT dans la liste
Le client tape D, puis U au bout d'une demi-seconde, puis P au bout d'une seconde. La liste va se positionner sur les noms démarrant par D, puis par DU, puis par P car il a attendu trop longtemps pour taper la lettre P. Y-a-t'il un moyen de modifier la temporisation de saisie? Je n'ai rien trouvé sur internet à ce sujet.
Merci de votre aide
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
3
Merci
Bonjour.

J'ai oublié de vous dire que ce que j'ai appelé les Inscrits doivent se présenter en ordre alphabétique. Mais vous l'avez sans doute compris vu le principe dichotomique employé pour le calcul des index.

Cordialement.


Étant illettré, je signe d'une croix : ×

Merci Zermelo 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Zermelo
0
Merci
Bonjour EISDCC.

Effectivement, la temporisation d'un ComboBox n'est pas accessible. Par contre, si vous copiez, temporairement ou non, le contenu du ComboBox dans un fichier ou un tableau, il serait facile de faire cette saisie au clavier en prenant tout son temps. J'ai fait cela en vb6 il y a plus de 10 ans avec noms et patronymes. Si vous avez des notions sur cet outil, vous pourriez transposer ce bout de programme. Faites-moi savoir si cela vous intéresse.



Cordialement

Étant illettré, je signe d'une croix : ×
Commenter la réponse de Zermelo
EISDCC 12 Messages postés mardi 3 août 2004Date d'inscription 14 mai 2013 Dernière intervention - 19 mars 2013 à 19:04
0
Merci
Bonjour Zermelo
J'ai longtemps programmé en vb6 (et encore actuellemnt pour certains clients). Je suis effectivement intéressé par ce code que je pourrai transposer car c'est un problème remonté par de nombreux clients. Je n'ai pas cherché de moyen détourné pour y arriver, espérant toujours accéder à la valeur de temporisation, éventuellement par une API.
Merci d'avance
Commenter la réponse de EISDCC
0
Merci
Bonjour EISDCC.

Voici le code promis. Il met en jeu trois contrôles,
a) un contrôle tSél As TextBox, pour la sélection.
b) un contrôle tRst As Label, pour afficher le résultat définitif,
c) un contrôle tRsts As ListBox, pour afficher les résultats intermédiaires.
En espérant que ce vous sera utile.

Option Explicit
Option Compare Text
Private Inscrits() As String
Private Rsts() As String

Private Sub Form_Initialize()
ReDim Inscrits(0 To 6)
Inscrits(1) = "Tata"
Inscrits(2) = "Titi"
Inscrits(3) = "Toto"
Inscrits(4) = "Totou"
Inscrits(5) = "Tutu"
Inscrits(6) = "Tu"
ReDim Rsts(0 To 0)
End Sub

Private Sub tSél_Change()
Dim Txt As String, i As Long, n As Long
Txt = tSél.Text
    Rsts = Résultats(Txt, Inscrits)
    n = UBound(Rsts)
    tRst.Caption = "": tRsts.Clear
    If n = 1 Then
        tRst.Caption = Rsts(1)
    Else
        For i = 1 To n
            tRsts.AddItem (Rsts(i))
        Next i
    End If
End Sub

Private Sub tRsts_Click()
    Dim r As Integer
    r tRsts.ListIndex: tRst.Caption tRsts.List(r): tRsts.Clear
End Sub

Private Function Résultats(Txt As String, Lst() As String) As String()
Dim Rsts() As String, IndI As Long, IndS As Long
Dim Ok As Boolean, i As Long, n As Long
ReDim Rsts(0 To 0)
If Len(Txt) > 0 Then IndI IndiceInférieur(Txt, Lst): IndS IndiceSupérieur(Txt, Lst)
Ok = ((IndI > 0) And (IndS > 0))
If Ok Then
    n = IndS - IndI + 1
    ReDim Rsts(0 To n)
    For i = 1 To n
        Rsts(i) = Lst(IndI + i - 1)
    Next i
End If
Résultats = Rsts
End Function

Private Function IndiceInférieur(Txt As String, Lst() As String) As Long
Dim n As Long, Ind As Long, a As Long, b As Long, c As Long, p As Long
n UBound(Lst): Ind 0: p = Len(Txt)
a 1: b n
Do
    If b - a = 1 Then Exit Do
    c = Int((a + b) / 2): If Txt <= Left(Lst(c), p) Then b = c Else a = c
    Loop
If Txt = Left(Lst(a), p) Then
    Ind = a
ElseIf Txt = Left(Lst(b), p) Then
    Ind = b
End If
IndiceInférieur = Ind
End Function

Private Function IndiceSupérieur(Txt As String, Lst() As String) As Long
Dim n As Long, Ind As Long, a As Long, b As Long, c As Long, p As Long
n UBound(Lst): Ind 0: p = Len(Txt)
a 1: b n
Do
    If b - a = 1 Then Exit Do
    c = Int((a + b) / 2): If Txt >= Left(Lst(c), p) Then a = c Else b = c
Loop
If Txt = Left(Lst(b), p) Then
    Ind = b
ElseIf Txt = Left(Lst(a), p) Then
    Ind = a
End If
IndiceSupérieur = Ind
End Function



Étant illettré, je signe d'une croix : ×
Commenter la réponse de Zermelo
EISDCC 12 Messages postés mardi 3 août 2004Date d'inscription 14 mai 2013 Dernière intervention - 21 mars 2013 à 12:13
0
Merci
Bonjour
Merci pour ce code. Je n'avais pas cherché à utiliser d'autre types de contrôle pour ma saisie. Le code est effectivement facile à adapter à vbnet.
Cela fonctionne parfaitement.
Cordialement
Commenter la réponse de EISDCC

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.