2009-08-12 11 views
1

So gibt es eine Reihe von Fragen ähnlich wie meine, aber keine genau das, was ich brauche. Ich habe eine Combobox, die mit einer Liste von Städten gefüllt ist. Ich habe die Autocomplete eingeschaltet und das funktioniert genau so, wie ich das mit dem Suggestapped auch angeschaltet habe. Das Problem besteht jedoch darin, dass der Benutzer das Element nicht auswählt, wenn er versucht, das Kombinationsfeld zu verlassen. Hier ist ein Beispiel: Ich suche nach "Orlando". Wenn ich "orla" eintippe, füllt der Vorschlag den Rest des Wortes aus (ausgewählt), so dass "orlando" angezeigt wird. Das ist also der Punkt, den ich auswählen möchte. Wenn ich "Enter" und dann "Tab" drücke, wird das Element ausgewählt und dann ausgeblendet. Was ich jedoch brauche, ist das Tab-out, um das zugrunde liegende Element auszuwählen, das mit dem Wort übereinstimmt. Wenn ich mehr erklären muss, kann ich. Vielen Dank im Voraus!Combobox Autocomplete Tab-out wählt nicht Element

Luke

+0

Mögliche Duplikat [WinForms Combobox zur automatischen Vervollständigung Wert auf Lost-Focus verliert] (http://stackoverflow.com/questions/13291945/winforms-combobox-loses- autocomplete-value-on-lostfocus) – Breeze

Antwort

1

Welche Version von .NET verwenden Sie? Ich habe es in 3.5 versucht, und das Verhalten ist das Gegenteil von dem, was Sie beschreiben. Wenn ich einen Teilnamen und einen Tabulator austippe, wird das Element in der Liste ausgewählt. Wenn ich die Eingabetaste drücke, wird das Element nicht ausgewählt und der tatsächlich eingegebene Wert wird gelöscht.

Wie sind Ihre Eigenschaften auf der ComboBox eingestellt? Ich habe AutoCompleteMode = SuggestAppend und AutoCompleteSource = ListItems.

+0

Gleiches Verhalten in 2.0 (Tab-out wählt wählt) –

+0

Ich verwende 3,5 sp1. Was passiert für mich ist, wenn ich Tab lege, füllt es den Rest des Textes (aber nicht den ersten Buchstaben), und wählt nicht das Bindeelement. Ich habe einen Ereignishandler auf der OnLeave für das Kombinationsfeld, so dass es ausgelöst wird, nachdem die Registerkarte getroffen wurde. Wenn es ausgelöst wird, ist das ComboBox.SelectedItem == null. Ich habe diesen Event-Handler dort, weil ich sicherstellen muss, dass sie die Box nicht verlassen, ohne eine Stadt auszuwählen, weil sie keine neue hinzufügen dürfen. – luke

+0

Ok, wir haben beide recht, in gewisser Weise. Zu dem Zeitpunkt, zu dem das onLeave-Ereignis ausgelöst wird, wurde das Element noch nicht ausgewählt. Sobald es jedoch verlassen hat, wählt es den Gegenstand aus. Also meine neue Frage ist, weißt du von einer Möglichkeit, die ich beschränken kann, die ComboBox ohne einen ausgewählten Artikel verlassen? Ich kann das onLeave nicht verwenden, weil es noch nicht ausgewählt wurde. – luke

0

Ich bekomme das gleiche Verhalten wie OP und die markierte Antwort (von Albert, der das Problem nicht reproduzieren kann) ist keine Lösung. Dieses Problem wird auch berichtet, als Wanze Connect:

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

ich nicht die Mühe, eine benutzerdefinierte Combobox Kontrolle zu schaffen, wie in der Problemumgehung Abschnitt des Connect Bug angegeben. Statt stelle ich nur die Dropdownlist mit einem Standardwert:

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

der Link ist tot. – Breeze

+0

Dam, ich frage mich, ob es in der Art und Weise zurück Zeitmaschine ist –

+1

vielleicht ist es, weil es jetzt ein Hotfix ist? https://support.microsoft.com/en-us/help/2868238/a-combo-box-control-selects-an-unexpected-value-in-windows-7-sp-1-or-windows-server- 2008-r2 – Breeze

0

Der Wert am WM_KILLFOCUS Nachricht verloren geht. Überschreiben WndProc in einer Unterklasse von ComboBox löste dieses Problem für mich. Leider habe ich nur VB.NET-Code auf der Hand:

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 
Verwandte Themen