プログラムブログ

プログラム中に便利そうだと思ったもの、忘れそうなこと等を書きます

誰かの役に立てばいいのですが・・・

コンボボックスのエラー?

2011-05-20 13:57:37 | プログラム
VB:VB2010(Windowsフォーム)
動作OS:Windows7
内容:コンボボックス

コンボボックスの中身
10:東京
11:埼玉
12:千葉
13:神奈川
14:静岡
15:大阪
16:兵庫

コンボボックスにフォーカスが当たっているときに「13」と入力すれば神奈川に、「11」と入力すれば埼玉に、「15」と入力すれば大阪に飛ばすには
DropDownStyle:DropDownList
AutoCompleteMode:Suggest
AutoCompleteSource:ListItems
とします
この辺を設定しないと、2文字以上の場合に選択が飛びません

しかしこの方法だと、うまく入力した場所に飛んでくれません
15と入力しているのに10に飛び、次に13と入力しているのに10次の11に飛んだりします
(これがバグなのかはわかりません・・・)

そこで

Private mbTab As Boolean
Private miPrevIndex As Integer = -1
Private Sub DropDownListEx_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Validating
miPrevIndex = Me.SelectedIndex
MyBase.OnSelectedIndexChanged(e)
End Sub
Private Sub DropDownListEx_PreviewKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles Me.PreviewKeyDown
If (e.KeyCode = Windows.Forms.Keys.Tab) Then
mbTab = True
ElseIf (e.KeyCode = Windows.Forms.Keys.Enter) Then
mbTab = True
End If
End Sub
Protected Overrides Sub OnDropDownClosed(ByVal e As System.EventArgs)
MyBase.OnDropDownClosed(e)
If Me.SelectedIndex <> miPrevIndex Then
If mbTab = True Then
Me.SelectedIndex = miPrevIndex
Else
miPrevIndex = Me.SelectedIndex
End If
MyBase.OnSelectedIndexChanged(e)
End If
End Sub

Protected Overrides Sub OnSelectionChangeCommitted(ByVal e As System.EventArgs)
MyBase.OnSelectionChangeCommitted(e)
miPrevIndex = Me.SelectedIndex
End Sub


を拡張コンボボックスのクラス内に入れます
これで回避できます

Windows7だけの問題なのか、XPでも起きるのかは定かではありません