2016-12-14 5 views
1

データベースを検索するためのコンボボックスがあります。ドロップダウンリストには、ユーザーが検索しているアイテムに一致するアイテムがあるかどうかが表示され、一致しない場合は取り消されます。しかし、私のコードがDroppedDownの値をFalseに変更すると、すぐに "ArgumentOutOfRangeException"が返されます。コンボボックスの「Droppeddown」値をfalseに設定したときに引数が範囲外になる

エラーには、「追加情報:InvalidArgument = '0'の値が 'index'に無効です」というエラーが含まれています。

私はコンボボックスを試して自動更新するため、何が起こっているのか分かりません。

'Search box - Text Update Event 
    Private Sub searchBoxCB_TextUpdate(sender As Object, e As EventArgs) Handles searchBoxCB.TextUpdate 
     'Begin search when user types 

     searchBoxCB.Items.Clear() 

     'Check if search has numbers in it 
     Dim letters() As Char = searchBoxCB.Text 
     Dim noNumbers As Boolean = True 

     For Each c As Char In letters 

      If (IsNumeric(c)) Then 

       noNumbers = False 

      End If 

     Next 

     'Only search if no numbers 
     If (noNumbers) Then 

      searchDataPerson(searchBoxCB.Text, "Person1") 
      searchDataPerson(searchBoxCB.Text, "Person2") 

     End If 

     searchBoxCB.SelectionStart = searchBoxCB.Text.Length + 1 'Move cursor to end 

     Cursor.Current = Cursors.Default 

    End Sub 

    'Search PERSON operation 
    Private Sub searchDataPerson(input As String, person As String) 

     Dim itemAdded As Boolean = False 

     myConnection.Open() 

     Dim str As String = "SELECT * FROM AllEmployeeDirectory WHERE " + person + " Like """ + input + "%""" 'Searches for NAMES beginning with input 
     Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection) '* 
     dr = cmd.ExecuteReader '* 

     'Reads through all data 
     While dr.Read 

      searchBoxCB.DroppedDown = True 
      searchBoxCB.Items.Add(dr(person) + " - " + dr("Desk")) 
      itemAdded = True 

     End While 

     If (Not itemAdded) Then 

      searchBoxCB.DroppedDown = False 'ERROR OCCURS HERE 

     End If 

     myConnection.Close() 

    End Sub 
+1

私はそれがあなたの操作の順序かもしれない良い気分を持っています。投稿していないので、私はそれを確認することはできません。 – Codexer

+2

私はザグラー氏の良い気持ちをよく感じています。 – Plutonix

+0

質問の一部ではなく、外部のウェブサイトにコードを掲載したという事実について、私は心配しています。 :-( –

答えて

0

私はあなたのコードがそれの多く変動しても動作させることができませんでした。

Option Infer On 

Public Class Form1 

    Public Shared Function ACSC(s1 As String, s2 As String) As AutoCompleteStringCollection 
     'TODO: substitute your query for obtaining the data here 
     Dim a = {"A", "B", "AB", "CBA", "CB", "BC", "ABC"} 

     Dim sc As New AutoCompleteStringCollection 
     sc.AddRange(a.ToArray()) 

     Return sc 

    End Function 

    Private Sub searchBoxCB_TextChanged(sender As Object, e As EventArgs) Handles searchBoxCB.TextChanged 
     Dim txt = DirectCast(sender, ComboBox).Text 
     searchBoxCB.AutoCompleteSource = AutoCompleteSource.CustomSource 
     searchBoxCB.AutoCompleteCustomSource = ACSC(txt, "") 

    End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     searchBoxCB.AutoCompleteMode = AutoCompleteMode.SuggestAppend 

    End Sub 

End Class 

a.ToArray()aは、LINQのメソッドであることを起こる場合だけである:

しかし、私はあなたがこのコードでオートコンプリートを使用するようにコンボボックスを設定することで、作業するつもりだと思うものを得ました。 )

クレジット:how List become AutoCompleteStringCollection

+0

これは「うまくいく」ですが、ドロップダウンメニューを実際にドロップしてアイテムをクリックするようにしたいと思っています。選択と項目の後に関数を実行する方法は、ユーザーがドロップダウンから選択できるようにすればもっと簡単になります。 – AshIsBlue

+0

私は完全なモードを追加するのではなく、Suggestに変更しました。それは、私が望むことをします。私が提案のインデックスを得ることができるかどうかはわかりませんが、私は実験します。 – AshIsBlue

+0

私は、あなたがそれを稼働させようとしているようにはそれほど素晴らしいものではないことに同意しますが、少なくとも1つの選択肢があればドロップダウンを表示します。 try..Catchに 'searchBoxCB.DroppedDown = False 'というエラーがありますが、' searchBoxCB.SelectionStart = searchBoxCB.Text.Length + 1'になったときに例外が無視されたとしても、私はこのエラーを無視しています。 –

0

はいくつかイライラする実験をした後、私は元のコードに簡単な解決策の実現に来ました。 searchBoxCB.DroppedDown = Falseの代わりに、私はsearchBoxCB.DropDownHeight = 1に変更しました。これは効果的に同じことをします。次に、DroppedDown値がtrueに設定されている高さを65に戻します。これは意図したとおりに動作しています。以前はこの回避策は考えていませんでした。

関連する問題