トップ回答者
コンボボックスの表示について

質問
-
VisualStudio2005ExpressEditions
Windows2000上記の環境で次のコードを実行した際に理解できていない部分があるようなのでご指摘頂ければと思い投稿します。
Public Class Form1
Private Sub comboBox1_SelectionChangeCommitted(ByVal sender _
As Object, ByVal e As EventArgs) _
Handles ComboBox1.SelectionChangeCommittedMe.Label1.Text = Me.ComboBox1.Text
End Sub
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
Me.ComboBox1.Items.Add("001 | 犬")
Me.ComboBox1.Items.Add("002 | ネコ")
Me.ComboBox1.Items.Add("003 | サル")
Me.ComboBox1.Items.Add("004 | 鳥")
End Sub
End Classコードを実行するとフォーム上にある「コンボボックス」を選択すると選択した内容がラベルに表示されるのですが、マウスでコンボの内容を選択すると一つ前の内容がラベルに表示されてしまいます。
例:最初に「犬」をクリックするとラベルは変化なし、次に「ネコ」を選択するとラベルには一つ前に選択した「犬」が表示されます。キーボードで↑↓を選択し、Enterキーを押すと選択された内容がラベルに表示されます。(これが希望する動き)
comboBox1_SelectionChangeCommittedで処理を行う事がおかしいのでしょうか。
それとも何か必要なコードがぬけているのでしょうか。お手数ですがお力をお貸し下さる様お願いします。
回答
-
さっそくの回答ありがとうございます。(「言ったもん勝ち」にかけていました。^^;)
ご指摘のあったように当初は「SelectedIndexChanged」イベントを使用しておりましたが、
キーボードを使用してコンボのリストを選択している途中にラベルの内容が変わってしまいます。MSDNを引用すると
SelectionChangeCommitted は、ユーザーがコンボ ボックスの選択項目を変更したときにのみ発生します。SelectedIndexChanged イベントと SelectedValueChanged イベントは、プログラム上で選択項目が変更されたときにも発生するため、ユーザーによる変更をキャプチャする目的でこれらのイベントを使用しないでください。
実際のPGではコンボボックスを選択するとテーブルをみにいき対象データを引っ張ってきて表示をするという流れなので、できればスマートにしたいと考えました。そこで修正をしようと考えていた際に壁にあたった状況です。
フォーカスを次へ移動する際のイベントで引っ張ってくるようにするしか回避策はないのでしょうか。
2005Expressを触り始めたばかりな私が考える事が実現できない事もあるのでしょうかね・・・。
-
>>かにたくさん
かにたく さんからの引用 ご指摘のあったように当初は「SelectedIndexChanged」イベントを使用しておりましたが、
キーボードを使用してコンボのリストを選択している途中にラベルの内容が変わってしまいます。実際のPGではコンボボックスを選択するとテーブルをみにいき対象データを引っ張ってきて表示をするという流れなので、できればスマートにしたいと考えました。そこで修正をしようと考えていた際に壁にあたった状況です。 フォーカスを次へ移動する際のイベントで引っ張ってくるようにするしか回避策はないのでしょうか。
なるほど、そういうことでしたか。
以下のようなソースでご希望どおりになりますでしょうか?
Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted If Me.ComboBox1.DroppedDown Then Me.Label1.Text = Me.ComboBox1.Text End If End Sub Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged If Not Me.ComboBox1.DroppedDown Then Me.Label1.Text = Me.ComboBox1.Text End If End Sub
試していないので、何とも言えませんが、
- ComboBox がドロップダウン中の時は、キーボードでの選択は決定扱いにしない
- ComboBox がドロップダウン中の時は、マウスでのクリックによる選択は決定扱いにする
- ComboBox がドロップダウン中でない時は、キーボードでの選択も決定扱いにする
もっと、何か良い方法があるような気がしますが...
- ComboBox がドロップダウン中の時は、キーボードでの選択は決定扱いにしない
-
回答ありがとうございました。
説明が下手な為お時間を取らせて済みませんでした。最終形が出来ました。次のようになります。
Public Class Form1
'コンボボックスにフォーカスが来た時にコンボをドロップダウン
Private Sub ComboBox1_Enter(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ComboBox1.Enter
Me.ComboBox1.DroppedDown = True
End Sub'フォームを読み込む時にコンボの内容を追加
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
Me.ComboBox1.Items.Add("001 | 犬")
Me.ComboBox1.Items.Add("002 | ネコ")
Me.ComboBox1.Items.Add("003 | サル")
Me.ComboBox1.Items.Add("004 | 鳥")End Sub
'ComboBoxの内容を選択が決定した時にリストがドロップ中なら表示(マウス選択時動作1、キーボード選択時動作2)
Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted
If Me.ComboBox1.DroppedDown Then
Me.Label1.Text = Me.ComboBox1.Text
End If
End Sub'CombBoxがドロップダウン中はインデックスが変更しても表示しない(キーボード選択時動作1)
'CombBoxがドロップダウンが閉じている時は表示する(マウス選択時動作2、キーボード選択時動作3)
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
If Not Me.ComboBox1.DroppedDown Then
Me.Label1.Text = Me.ComboBox1.Text
End If
End Sub'ComboBoxにてキーボードにて↑↓を押した場合
Private Sub ComboBox1_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles ComboBox1.KeyDown
Dim T As Object
T = Asc(e.KeyCode)
Select Case T
Case 51
Me.ComboBox1.DroppedDown = True
Case 52
Me.ComboBox1.DroppedDown = True
Case Else
End Select
End Sub'ComboBoxをクリックした際にドロップダウン
Private Sub ComboBox1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ComboBox1.Click
Me.ComboBox1.DroppedDown = True
End Sub
End Classこれをアップして今後も自分自身が確認もできるようにします。
本当にありがとうございました。
すべての返信
-
さっそくの回答ありがとうございます。(「言ったもん勝ち」にかけていました。^^;)
ご指摘のあったように当初は「SelectedIndexChanged」イベントを使用しておりましたが、
キーボードを使用してコンボのリストを選択している途中にラベルの内容が変わってしまいます。MSDNを引用すると
SelectionChangeCommitted は、ユーザーがコンボ ボックスの選択項目を変更したときにのみ発生します。SelectedIndexChanged イベントと SelectedValueChanged イベントは、プログラム上で選択項目が変更されたときにも発生するため、ユーザーによる変更をキャプチャする目的でこれらのイベントを使用しないでください。
実際のPGではコンボボックスを選択するとテーブルをみにいき対象データを引っ張ってきて表示をするという流れなので、できればスマートにしたいと考えました。そこで修正をしようと考えていた際に壁にあたった状況です。
フォーカスを次へ移動する際のイベントで引っ張ってくるようにするしか回避策はないのでしょうか。
2005Expressを触り始めたばかりな私が考える事が実現できない事もあるのでしょうかね・・・。
-
>>かにたくさん
かにたく さんからの引用 ご指摘のあったように当初は「SelectedIndexChanged」イベントを使用しておりましたが、
キーボードを使用してコンボのリストを選択している途中にラベルの内容が変わってしまいます。実際のPGではコンボボックスを選択するとテーブルをみにいき対象データを引っ張ってきて表示をするという流れなので、できればスマートにしたいと考えました。そこで修正をしようと考えていた際に壁にあたった状況です。 フォーカスを次へ移動する際のイベントで引っ張ってくるようにするしか回避策はないのでしょうか。
なるほど、そういうことでしたか。
以下のようなソースでご希望どおりになりますでしょうか?
Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted If Me.ComboBox1.DroppedDown Then Me.Label1.Text = Me.ComboBox1.Text End If End Sub Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged If Not Me.ComboBox1.DroppedDown Then Me.Label1.Text = Me.ComboBox1.Text End If End Sub
試していないので、何とも言えませんが、
- ComboBox がドロップダウン中の時は、キーボードでの選択は決定扱いにしない
- ComboBox がドロップダウン中の時は、マウスでのクリックによる選択は決定扱いにする
- ComboBox がドロップダウン中でない時は、キーボードでの選択も決定扱いにする
もっと、何か良い方法があるような気がしますが...
- ComboBox がドロップダウン中の時は、キーボードでの選択は決定扱いにしない
-
回答ありがとうございました。
説明が下手な為お時間を取らせて済みませんでした。最終形が出来ました。次のようになります。
Public Class Form1
'コンボボックスにフォーカスが来た時にコンボをドロップダウン
Private Sub ComboBox1_Enter(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ComboBox1.Enter
Me.ComboBox1.DroppedDown = True
End Sub'フォームを読み込む時にコンボの内容を追加
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
Me.ComboBox1.Items.Add("001 | 犬")
Me.ComboBox1.Items.Add("002 | ネコ")
Me.ComboBox1.Items.Add("003 | サル")
Me.ComboBox1.Items.Add("004 | 鳥")End Sub
'ComboBoxの内容を選択が決定した時にリストがドロップ中なら表示(マウス選択時動作1、キーボード選択時動作2)
Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted
If Me.ComboBox1.DroppedDown Then
Me.Label1.Text = Me.ComboBox1.Text
End If
End Sub'CombBoxがドロップダウン中はインデックスが変更しても表示しない(キーボード選択時動作1)
'CombBoxがドロップダウンが閉じている時は表示する(マウス選択時動作2、キーボード選択時動作3)
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
If Not Me.ComboBox1.DroppedDown Then
Me.Label1.Text = Me.ComboBox1.Text
End If
End Sub'ComboBoxにてキーボードにて↑↓を押した場合
Private Sub ComboBox1_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles ComboBox1.KeyDown
Dim T As Object
T = Asc(e.KeyCode)
Select Case T
Case 51
Me.ComboBox1.DroppedDown = True
Case 52
Me.ComboBox1.DroppedDown = True
Case Else
End Select
End Sub'ComboBoxをクリックした際にドロップダウン
Private Sub ComboBox1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ComboBox1.Click
Me.ComboBox1.DroppedDown = True
End Sub
End Classこれをアップして今後も自分自身が確認もできるようにします。
本当にありがとうございました。