1

フォームのドロップダウンモードのComboBoxが、データソースとして一意のアイテムの固定ArrayListを持っているコードがあります。通常、これはユーザーにとっては問題なく機能しますが、ごくまれに、SelectedIndexが、ユーザーが入力したComboBoxテキストプロパティで表されるアイテムに対応するアイテムに失敗する場合に発生します(正当なアイテムであっても)。

具体的には、ユーザーはComboBoxテキストフィールドに正当なエントリをテキストとして入力し、マウスを使用して別のコントロールに移動します。テキストフィールドには引き続きエントリが表示されますが、後で、表示されているテキストに対応するSelectedIndexに依存するメソッドを使用してユーザーが変更をコミットすると、SelectedIndexが正しくない場合があります。

公式ドキュメントhttp://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.text.aspxには次のように記載されています。

"Textプロパティをnullまたは空の文字列(" ")に設定すると、SelectedIndexが-1に設定されます。TextプロパティをItemsコレクションにある値に設定すると、SelectedIndexがそのアイテムのインデックスに設定されます。Textプロパティをに設定します。コレクションにない値は、SelectedIndexを変更しないままにします。」

したがって、正当なテキストエントリは、SelectedIndexを適切な番号に移動する必要があります。重要なことが起こる前に、イベントハンドラーに整合性チェックを強制できることは知っていますが、ComboBoxが実際に何をしているのかをよりよく理解するために、ドキュメントに直面するこのまれなバグの原因は何でしょうか。助けていただければ幸いです。

4

2 に答える 2

3

そうです、いくつかのテストの後、これが私の結論です。

コンボボックスのテキストフィールドに入力しているときは、実際にはインデックスの選択をトリガーしていません。ただし、Textプロパティを値に設定した場合。つまり、Combobox1.Text = "Existing item"の場合、選択したインデックスを設定します。したがって、コンボボックスで選択する代わりに入力した場合、データベースに正しい結果が表示されないはずです。

そうです、これはそれが愚かになるところです。これは機能します:

Private Sub ComboBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.TextChanged
    ComboBox1.Text = ComboBox1.Text
End Sub

ただし、代わりにこれを行うことをお勧めします。

Private Sub ComboBox1_Leave(sender As System.Object, e As System.EventArgs) Handles ComboBox1.Leave
    ComboBox1.Text = ComboBox1.Text
End Sub

私の答えを変えるために、これを追加します。

コンボボックスにこれらの設定を追加すると、leaveイベントなしで入力が機能します。

    ComboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend
    ComboBox1.AutoCompleteSource = AutoCompleteSource.ListItems
于 2013-01-25T14:20:57.913 に答える
2

ComboBoxがドロップダウンモードの場合、ユーザーがリスト内の項目から選択していなくても、SelectedIndexChangedは発生しません。したがって、ユーザーがエントリを入力し、ムースを使用して移動した場合、selectedIndexは変更されません。これを機能させるには、ComboBox.Leaveイベントを手動で処理して、ユーザーが入力したテキストが選択されるようにする必要があります。

Private Sub ComboBox1_Leave(sender As Object, e As System.EventArgs) Handles ComboBox1.Leave
    ' This will cause the SelectedIndex to be changed, thus firing the Selected_IndexChanged Event:
    ComboBox1.SelectedIndex = ComboBox1.FindStringExact(ComboBox1.Text)
End Sub

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    MsgBox("SelectedIndex =" & ComboBox1.SelectedIndex.ToString())
End Sub
于 2013-01-25T14:20:45.830 に答える