2017-12-19 6 views
0

バインドされたコンボボックスがあり、データソースがソートされていますが、入力を開始すると自動的にアイテムの再ソートが行われるようです。私はこのコードを使用たとえばバインドされたコンボボックスオートコンプリートソート

:私はjを入力すると

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim dt As New DataTable 
    With dt 
     .Columns.Add("id", GetType(Long)) 
     .Columns.Add("Name", GetType(String)) 
     .Rows.Add({1, "John"}) 
     .Rows.Add({2, "Jan"}) 
    End With 

    With Me.ComboBox1 
     .DataSource = dt 
     .ValueMember = "id" 
     .DisplayMember = "Name" 

     .DropDownStyle = ComboBoxStyle.DropDown 
     .AutoCompleteMode = AutoCompleteMode.SuggestAppend 
     .AutoCompleteSource = AutoCompleteSource.ListItems 
    End With 
End Sub 

は今、コンボボックスはJanを提案するが、私は最初の項目Johnをしたいです。

無制限のコンボボックスの場合、これは動作します:How to provide automatic text completion for a ComboBox control in Visual Basic .NET or in Visual Basic 2005また、this questionは無制限のコンボボックス用です。

+0

コンボボックスの 'Sorted'プロパティはTrueに設定されていますか? – dotNET

+0

@ドットネット、いいえ、それは偽です。上記のコード以外のコンボボックスのプロパティは編集しませんでした。 – Fadi

+1

私はそれにしばらく時間を費やしました。私は考えることができる簡単な回避策がない、本物の問題と思われます。提案のリストは、カスタムソースの場合でも常にアルファベット順にソートされているように見えます。しかし、アルファベット順に並べ替えられた提案のリストが検索しやすくなるため、これも機能として行うことができます。 – dotNET

答えて

0

私はthis linkにコードを修正し、必要に応じて、今それが動作します:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim dt As New DataTable 
    With dt 
     .Columns.Add("id", GetType(Long)) 
     .Columns.Add("Name", GetType(String)) 
     .Rows.Add({1, "John"}) 
     .Rows.Add({2, "Jan"}) 
    End With 

    With Me.ComboBox1 
     .DataSource = dt 
     .ValueMember = "id" 
     .DisplayMember = "Name" 
     .DropDownStyle = ComboBoxStyle.DropDown 
     .AutoCompleteMode = AutoCompleteMode.None 
    End With 
End Sub 

Private Sub ComboBox1_KeyUp(sender As Object, e As KeyEventArgs) Handles ComboBox1.KeyUp 

    ' Do nothing for some keys such as navigation keys. 
    If ((e.KeyCode = Keys.Back) Or 
     (e.KeyCode = Keys.Left) Or 
     (e.KeyCode = Keys.Right) Or 
     (e.KeyCode = Keys.Up) Or 
     (e.KeyCode = Keys.Delete) Or 
     (e.KeyCode = Keys.Down) Or 
     (e.KeyCode = Keys.PageUp) Or 
     (e.KeyCode = Keys.PageDown) Or 
     (e.KeyCode = Keys.Home) Or 
     (e.KeyCode = Keys.End)) Then 

     Return 
    End If 

    Dim actual As String = Me.ComboBox1.Text 
    Dim dt As DataTable = Me.ComboBox1.DataSource 
    Dim dr = dt.Select("Name like '" & actual & "%'") 
    If dr.Count > 0 Then 
     Dim found As String 
     With Me.ComboBox1 
      .DroppedDown = True 
      Cursor.Current = Cursors.Default 'to show the cursor again 
      found = dr(0)("Name") 
      .Text = found 
      .SelectionStart = actual.Length 
      .SelectionLength = found.Length 
     End With 
    End If 

End Sub 

私はthis problemを解決するために、このラインCursor.Current = Cursors.Defaultを追加しました。

関連する問題