2009-08-12 9 views
1

Donc, il y a un tas de questions similaires à la mienne, mais pas exactement ce dont j'ai besoin. J'ai un combobox qui est rempli avec une liste de villes. J'ai allumé la saisie semi-automatique et cela fonctionne exactement comme je le veux avec le suggérerappend également activé. Le problème est, cependant, si l'utilisateur essaie de tabuler hors de la zone de liste déroulante, il ne sélectionne pas réellement l'élément. Voici un exemple: Je suis à la recherche de "Orlando". Si je tape "orla", la suggestion remplit le reste du mot (sélectionné), donc il montre "orlando". Donc, c'est l'élément que je veux sélectionner. Si je tape Enter, puis Tab Out, il va sélectionner l'élément, puis sortir. Ce dont j'ai besoin, c'est de tabuler pour sélectionner l'élément sous-jacent qui correspond au mot. Si je dois expliquer plus, je peux. Merci d'avance!Combobox Autocomplete Tab-out ne sélectionne pas l'article

Luke

+0

double possible de [Winforms combobox perd de sa valeur saisie semi-automatique LostFocus] (http://stackoverflow.com/questions/13291945/winforms-combobox-loses- autocomplete-value-on-lostfocus) – Breeze

Répondre

1

Quelle version de .NET utilisez-vous? Je l'ai essayé en 3.5, et le comportement est le contraire de ce que vous décrivez. Lorsque je tape un nom partiel et une tabulation, il sélectionne l'élément dans la liste. Si j'appuie sur Entrée, il ne sélectionne pas l'élément et efface la valeur que je viens d'entrer.

Comment vos propriétés sont-elles définies sur la ComboBox? J'ai AutoCompleteMode = SuggestAppend et AutoCompleteSource = ListItems.

+0

Même comportement dans la version 2.0 (la tabulation ne sélectionne pas) –

+0

J'utilise 3.5 sp1. Ce qui se passe pour moi, c'est quand je tabule, il remplit le reste du texte (mais ne capitalise pas la première lettre), et ne sélectionne pas l'élément de liaison. J'ai un gestionnaire d'événement sur le onLeave pour la zone de liste déroulante, de sorte que se déclenche après que l'onglet est frappé. Quand il est déclenché, comboBox.SelectedItem == null. J'ai ce gestionnaire d'événement là-bas parce que je dois m'assurer qu'ils ne quittent pas la boîte sans sélectionner une ville, parce qu'ils ne sont pas autorisés à en ajouter un nouveau. – luke

+0

Ok, donc nous avons tous les deux raison, d'une certaine manière. Au moment où l'événement onLeave est déclenché, l'élément n'a pas encore été sélectionné. Une fois qu'il est parti, cependant, il sélectionne l'élément. Donc, ma nouvelle question est, savez-vous d'une façon que je peux restreindre en laissant la comboBox sans un élément sélectionné? Je ne peux pas utiliser l'onLeave parce qu'il n'a pas encore été sélectionné. – luke

0

J'ai le même comportement que OP et la réponse marquée (d'Albert qui est incapable de reproduire le problème) n'est pas une solution. Cette question a également été signalé pour se connecter comme un bug:

https://connect.microsoft.com/VisualStudio/feedback/details/711945/tab-on-a-winforms-combobox-with-properties-dropdownstyle-dropdownlist-autocompletemode-append-autocompletesource-listitems-doesnt-work-correctly

Je ne l'ai pas pris la peine de créer un contrôle ComboBox personnalisé comme indiqué dans la section de contournement du Bug Connect. Au lieu de cela que je viens mis le dropdownlist avec une valeur par défaut:

cboAccount.SelectedValue = _accountList(0).Key; //<--Here I set a default value 
cboAccount.DroppedDown = true; 
+0

le lien est mort. – Breeze

+0

Dam, je me demande si c'est dans la machine à remonter le temps –

+1

c'est peut-être parce qu'il ya un correctif maintenant? https://support.microsoft.com/fr-fr/help/2868238/a-combo-box-control-selects-an-unexpected-value-in-windows-7-sp-1-or-windows-server- 2008-r2 – Breeze

0

La valeur se perd au message WM_KILLFOCUS. Remplacement WndProc dans une sous-classe de ComboBox résolu ce problème pour moi. Malheureusement, je ne dispose que VB.NET code à la main:

Protected Overrides Sub WndProc(ByRef m As Message) 
    If m.Msg = &H8 Then 'WM_KILLFOCUS 
     Dim sText As String = Me.Text 
     MyBase.WndProc(m) 
     Me.Text = sText 
     Exit Sub 
    End If 

    MyBase.WndProc(m) 
End Sub 
Questions connexes