2012-02-21 40 views
7

VB.NET(.NET Framework 2.0)のコンボボックスの自動補完動作に問題があります。VB.NET Combobox - 数値の自動補完動作

は私が数値値を入力するコンボボックスを使用していて、そのドロップダウンリストは、可能な数値値を提案します。このリストは昇順にソートされます。たとえば、{"10"、 "92"、 "9000"、 "9001"}です。

コンボボックスのプロパティを次のように設定されています。

  • AutoCompleteMode:SuggestAppend
  • AutoCompleteSource:リストアイテム
  • DropDownStyle:ドロップダウン
  • ソート:偽

ドロップダウンリストは、単にあります次のように入力します。

  • myCombobox.Items.Add( "10")
  • myCombobox.Items.Add( "92")
  • myCombobox.Items.Add( "9000")
  • myCombobox.Items.Add(」 9001 ")

何も入力しない場合、ドロップダウンリストの値の順序は、元の昇順で正しいです。しかし、何か入力を開始すると、ドロップダウンリストの推奨値がソート(英数字)されます。「9」を入力すると、候補のリストは{"9000"、 "9001"、 "92"}になります。

この動作がリストの値を元の昇順で取得しないようにしたいと考えています。私はどのように考え出すことができません...

可能性のある回避策は、リスト内の値をゼロで埋め込むことです。 {"0010"、 "0092"、 "9000"、 "9001"}しかし、私はこれを避けたいと思います。

編集:

bendataclearによって示唆されるように、一つは提案を表示するには、リストボックスを使用することができます。 これは小さなリストでは機能しますが、大きなリストには適していません。それは、いくつかのアプリケーションでは役に立ちます。 bendataclearによって与えられたコードに基づいて、私はそれがこの方法を働かせた:

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

Dim cursorPos As Integer = ComboBox1.SelectionStart 

    ListBox1.Items.Clear() 

    For Each s In ComboBox1.Items 
     If s.StartsWith(ComboBox1.Text) Then 
      ListBox1.Items.Add(s) 
     End If 
    Next 

    If ListBox1.Items.Count > 0 And ComboBox1.Text.Length > 0 Then 
     ComboBox1.Text = ListBox1.Items(0) 
     ComboBox1.SelectionStart = cursorPos 
     ComboBox1.SelectionLength = 0 
    End If 

End Sub 

コードが完全にテストされておらず、改善することができるが、主なアイデアがあります。

編集2:

DataGridViewを使用すると、パフォーマンスが向上します。それは私には十分だった。ありがとうbendataclear。

ただ、好奇心から、他の答えは歓迎される:)

答えて

3

は、カスタムソースを設定した場合でも、それはアルファベット順に、注文を再としてコンボボックスには、データを表示する際に問題になるようだ:

ComboBox1.Items.Add("10") 
ComboBox1.Items.Add("92") 
ComboBox1.Items.Add("9000") 
ComboBox1.Items.Add("9001") 

ComboBox1.AutoCompleteCustomSource.Add("10") 
ComboBox1.AutoCompleteCustomSource.Add("92") 
ComboBox1.AutoCompleteCustomSource.Add("9000") 
ComboBox1.AutoCompleteCustomSource.Add("9001") 

ComboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource 

私は、私は考えることができる唯一の方法は、(未テスト)のような、独自のオートコンプリート何かを作成することであると思う:

Dim cbotxt As String = ComboBox1.Text 
Dim key As String 

key = ChrW(e.KeyCode) 


ListBox1.Items.Clear() 

For Each i In ComboBox1.Items 

    Dim s As String = i.ToString() 

    If s.StartsWith(ComboBox1.Text & key) Then 

     ListBox1.Items.Add(s) 


    End If 

Next 

If ListBox1.Items.Count > 0 Then 
    ListBox1.Visible = True 
    ComboBox1.Text = ListBox1.Items(0) 

End If 

編集:

多くの項目のための良い方法は、(私はアプリケーションで10000 +のために使用しています):DataGridViewのリストボックスから

最初の変更。 は、次に文字列のリストを宣言すると、テキスト変更プロパティに続いて

Dim Numberlist as List<Of String> 

' Fill List using Numberlist.Add("String") 

を自動補完する値を入力します。

Filter = NumberList.FindAll(AddressOf checkNum) 

DataGridView1.DataSource = Filter 

と文字列をチェックする機能を追加します。

Function checkNum(ByVal b As String) As Boolean 

    If b.StartsWith(ComboBox1.Text) Then 
     Return True 
    Else 
     Return False 
    End If 

End Function 

このメソッドは、私が入力できるよりも速く10k個の項目を持つマシンで実行されます。

+0

ありがとうbendataclear。それは確かに進行する方法です。しかし、項目のリストが大きくなると遅くなります。 1つは、コンボボックスに入力されたテキストに応じて、可能なすべてのリストを構築するためにハッシュマップを使用することができ、そのたびにリスト全体を通過することを避けることができます。もっと簡単な方法が見つからないことは驚くべきことです...私はあなたの解決策を質問に追加しました。 – DevelBD

+0

回答に追加しました – bendataclear

+0

それは動作します。文字列はカスタムクラスにラップする必要があります。そうでなければ、文字列の長さだけがDataGridViewによって表示されます(http://stackoverflow.com/questions/479329/how-to-bind-a-string-list-to-aを参照)。 -datagrid)。 10kアイテムではうまく動作し、パソコンでは100kアイテムではかなり高速です。ありがとう! – DevelBD

関連する問題