none
コンボボックスの表示について RRS feed

  • 質問

  • VisualStudio2005ExpressEditions
    Windows2000

    上記の環境で次のコードを実行した際に理解できていない部分があるようなのでご指摘頂ければと思い投稿します。

    Public Class Form1
       Private Sub comboBox1_SelectionChangeCommitted(ByVal sender _
             As Object, ByVal e As EventArgs) _
                   Handles ComboBox1.SelectionChangeCommitted

          Me.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で処理を行う事がおかしいのでしょうか。
    それとも何か必要なコードがぬけているのでしょうか。

    お手数ですがお力をお貸し下さる様お願いします。

    2006年10月19日 2:01

回答

  • かにたくさん、こんにちは。(かにたく言ったもん勝ち?)

     かにたく さんからの引用
    comboBox1_SelectionChangeCommittedで処理を行う事がおかしいのでしょうか。

    ご希望のタイミングで起きるイベントは、SelectedIndexChanged イベントではないでしょうか?

    2006年10月19日 2:15
  • さっそくの回答ありがとうございます。(「言ったもん勝ち」にかけていました。^^;)

    ご指摘のあったように当初は「SelectedIndexChanged」イベントを使用しておりましたが、
    キーボードを使用してコンボのリストを選択している途中にラベルの内容が変わってしまいます。

    MSDNを引用すると

    SelectionChangeCommitted は、ユーザーがコンボ ボックスの選択項目を変更したときにのみ発生します。SelectedIndexChanged イベントと SelectedValueChanged イベントは、プログラム上で選択項目が変更されたときにも発生するため、ユーザーによる変更をキャプチャする目的でこれらのイベントを使用しないでください。

    実際のPGではコンボボックスを選択するとテーブルをみにいき対象データを引っ張ってきて表示をするという流れなので、できればスマートにしたいと考えました。そこで修正をしようと考えていた際に壁にあたった状況です。

    フォーカスを次へ移動する際のイベントで引っ張ってくるようにするしか回避策はないのでしょうか。

    2005Expressを触り始めたばかりな私が考える事が実現できない事もあるのでしょうかね・・・。

    2006年10月19日 4:16
  • >>かにたくさん

     かにたく さんからの引用
    ご指摘のあったように当初は「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 がドロップダウン中でない時は、キーボードでの選択も決定扱いにする

    もっと、何か良い方法があるような気がしますが...

    2006年10月19日 5:12
  • 回答ありがとうございました。
    説明が下手な為お時間を取らせて済みませんでした。

    最終形が出来ました。次のようになります。

    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

    これをアップして今後も自分自身が確認もできるようにします。
    本当にありがとうございました。

    2006年10月19日 7:21

すべての返信

  • かにたくさん、こんにちは。(かにたく言ったもん勝ち?)

     かにたく さんからの引用
    comboBox1_SelectionChangeCommittedで処理を行う事がおかしいのでしょうか。

    ご希望のタイミングで起きるイベントは、SelectedIndexChanged イベントではないでしょうか?

    2006年10月19日 2:15
  • さっそくの回答ありがとうございます。(「言ったもん勝ち」にかけていました。^^;)

    ご指摘のあったように当初は「SelectedIndexChanged」イベントを使用しておりましたが、
    キーボードを使用してコンボのリストを選択している途中にラベルの内容が変わってしまいます。

    MSDNを引用すると

    SelectionChangeCommitted は、ユーザーがコンボ ボックスの選択項目を変更したときにのみ発生します。SelectedIndexChanged イベントと SelectedValueChanged イベントは、プログラム上で選択項目が変更されたときにも発生するため、ユーザーによる変更をキャプチャする目的でこれらのイベントを使用しないでください。

    実際のPGではコンボボックスを選択するとテーブルをみにいき対象データを引っ張ってきて表示をするという流れなので、できればスマートにしたいと考えました。そこで修正をしようと考えていた際に壁にあたった状況です。

    フォーカスを次へ移動する際のイベントで引っ張ってくるようにするしか回避策はないのでしょうか。

    2005Expressを触り始めたばかりな私が考える事が実現できない事もあるのでしょうかね・・・。

    2006年10月19日 4:16
  • >>かにたくさん

     かにたく さんからの引用
    ご指摘のあったように当初は「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 がドロップダウン中でない時は、キーボードでの選択も決定扱いにする

    もっと、何か良い方法があるような気がしますが...

    2006年10月19日 5:12
  • 回答ありがとうございました。
    説明が下手な為お時間を取らせて済みませんでした。

    最終形が出来ました。次のようになります。

    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

    これをアップして今後も自分自身が確認もできるようにします。
    本当にありがとうございました。

    2006年10月19日 7:21