2016-08-03 6 views
0

ich ein Benutzerformular mit einem Dropdown-Kombination, die mit Gegenständen gefüllt wird, wenn die Form geöffnet wird. Wenn das Feld des Fokus hat, auf den Auf-/Ab-Pfeiltasten radelt durch die Elemente (wie es sein soll), oder der Benutzer kann aus der Dropdown-Liste auswählen und noch in der Lage sein, die noch nach oben/unten Pfeilen von dort. Wenn der Benutzer mit der Eingabe beginnt, wird die Box so eingestellt, dass sie aus den Listenelementen anfügt, aber dadurch werden die AUF-/AB-Pfeiltasten deaktiviert, um ALLE Elemente durchzulaufen. An diesem Punkt werden nur die Elemente durchlaufen, die mit dem beginnen, was der Benutzer eingegeben hat. Ich möchte es die eingegebenen Daten und durch alle die Combobox Elemente zu löschen (am Index begann, was angehängt wurde) so wie es in der VBA-Version der Fall ist.Visual Studio ComboBox läuft nicht durch die Elemente mit Auf-/Ab-Pfeile, sobald der Benutzer Typen

Auch wenn der Benutzer tippt etwas, wählt dann ein ganz anderes Element aus der Dropdown-Liste das nächste Mal nach oben/unten Tasten gedrückt werden, es geht nur zurück, was auch immer eingegeben wurde.

ich versucht, dies in den Pfeil Griff nach oben/unten keydown (oder keyup) wie folgt:

Private Sub SeriesBox_KeyDown(sender As Object, e As KeyEventArgs) Handles SeriesBox.KeyDown 

    Dim CurIndex As Integer = SeriesBox.FindStringExact(SeriesBox.Text) 
    Select Case e.KeyCode 

     Case Keys.Down 

      SeriesBox.Text = String.Empty 
      SeriesBox.SelectedIndex = CurIndex + 1 

     Case Keys.Up 

      SeriesBox.Text = String.Empty 
      SeriesBox.SelectedIndex = CurIndex - 1 

    End Select 

End Sub 

Mit den Pfeiltasten tatsächlich diese Unter nicht geben, also versuchte ich hinzufügen:

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keydata As Keys) As Boolean 

    If keydata = Keys.Right Or keydata = Keys.Left Or keydata = Keys.Up Or keydata = Keys.Down Then 
    OnKeyDown(New KeyEventArgs(keydata)) 
    ProcessCmdKey = True 
    Else 
    ProcessCmdKey = MyBase.ProcessCmdKey(msg, keydata) 
    End If 

End Function 

Aber dies scheint keinen Unterschied zu machen. Gibt es etwas, das mir fehlt?

+0

Können Sie nicht eine If-Anweisung verwenden? 'Wenn combobox_text =" "Dann arrowkey_keypress tut x, sonst arrowkey_keypress springt zum ersten angehängten Wert und geht nur zu angehängten Werten" Ich weiß, das ist Pseudocode, aber so etwas ist einen Versuch wert, hängt von Ihrem VB Erfahrungslevel – David

Antwort

0

arbeiten Dies kann:

erster Satz Sie die Combobox Autocomplete und AutoCompleteSouce-None

Dann ist diese in Ihren Code einfügen:

Private Sub SeriesBox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles SeriesBox.TextChanged 
    For Each it As String In SeriesBox.Items 
     If Not SeriesBox.Text = it Then 
      If it.Contains(SeriesBox.Text) Then 
       Dim length As Integer = SeriesBox.Text.Length 
       SeriesBox.Text = "" 
       SeriesBox.Text = it 
       SeriesBox.Select(length, SeriesBox.Text.Length - length) 
       SeriesBox.SelectedItem = SeriesBox.Text 
      End If 
     End If 
    Next 
End Sub 
+0

Danke Sie für die ausgezeichnete Lösung! Ich habe nicht daran gedacht, die Autocomplete manuell zu bearbeiten. Ich musste Ihren Code tatsächlich ein bisschen ändern, so dass er nur die Elemente finden würde, die mit dem beginnen, was eingegeben wurde. Ich änderte die "Wenn it.contains ..." auf "If Left (it, Len (SeriesBox.Text)) = SeriesBox.Text" – jbryan10

+0

Leider habe ich nicht bemerkt :) – BanForFun

Verwandte Themen