【VB.NET】データグリッドビューで行毎のコンボボックスにイベントを設定する
おはようございます。
引き続きVB.NETの話し。
今回はデータグリッドビューに配置したコンボボックスにイベントを設定するといったことをやってみます。
プログラムは前回のものを流用します。
スポンサーリンク
プログラムの修正
新規メソッド追加
ドロップダウンが(選択されて)閉じられた際の処理を新規メソッドで定義
Form1.vb
    ''' <summary>
    ''' データグリッドビューのコンボボックスが閉じられた際のイベント
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub dataGridViewComboBox_DropDownClosed(ByVal sender As Object,
                ByVal e As EventArgs)
        Dim cb As DataGridViewComboBoxEditingControl =
            DirectCast(sender, DataGridViewComboBoxEditingControl)
        cb.EditingControlDataGridView.NotifyCurrentCellDirty(True)
        ' 行ごとに処理を変更する
        If cb.EditingControlRowIndex = 0 Then
            MessageBox.Show("1行目のコンボボックス:" & cb.SelectedItem)
        ElseIf cb.EditingControlRowIndex = 1 Then
            MessageBox.Show("2行目のコンボボックス:" & cb.SelectedItem)
        ElseIf cb.EditingControlRowIndex = 2 Then
            MessageBox.Show("3行目のコンボボックス:" & cb.SelectedItem)
        End If
        cb.EditingControlDataGridView.EndEdit()
    End Sub
ここで、行インデックスや、列インデックス、または名前などを判定して処理を分岐します。
新規イベント追加
デザイナー画面でデータグリッドビューを選択し、プロパティ画面から対象のイベントを作成します。
データグリッドビューのセル内に設置したコンボボックスの内容が表示された際に、ドロップダウンが(選択されて)閉じられたイベントを追加します。
From1.vb
    ''' <summary>
    ''' 編集中コントロールが表示されている際のイベント
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub dgv_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles dgv.EditingControlShowing
        Dim cb = TryCast(e.Control, DataGridViewComboBoxEditingControl)
        If cb Is Nothing Then Return
        RemoveHandler cb.DropDownClosed, AddressOf dataGridViewComboBox_DropDownClosed
        AddHandler cb.DropDownClosed, AddressOf dataGridViewComboBox_DropDownClosed
    End Sub
既存処理の修正
データグリッド内のコンボボックスを選択した際に、
同じコンボボックスを連続でクリックすると正しく開かない問題が発覚したため既存の処理も修正。
Form1.vb
    ''' <summary>
    ''' データグリッドビューセルクリックイベント
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub dgv_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellClick
        Dim dgv As DataGridView = CType(sender, DataGridView)
        gridComboHandle(dgv, e)
    End Sub
    ''' <summary>
    ''' データグリッドビューのコンボボックス制御
    ''' </summary>
    ''' <param name="dgv"></param>
    ''' <param name="e"></param>
    Private Sub gridComboHandle(dgv As DataGridView, e As DataGridViewCellEventArgs)
        ' 対象の列だった場合
        If dgv.Columns(e.ColumnIndex).Name = "col3" Then
            SendKeys.SendWait("{F4}")
        End If
    End Sub
データグリッドビューのセルエンターイベントで処理していたのを、
セルクリックに変更して、更に「SendKey.Send」を「SendKey.SendWait」に変更。
起動してみる
起動後の画面です。
コンボボックスを選択します。
イベントが処理され、メッセージボックスが表示されました。
まとめ
データグリッドビューにコンポーネントを配置するってよくある話しだと思うんですが、何で標準でもっと便利にしてくれないんでしょうかね。
ちょっとハマった部分は、コンボボックスを1回で開くところですね。
まあなんとかなってよかったです。
また何かあれば記事にしようと思います。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません