2019-09-11に投稿

【VB.NET】データグリッドビューで行毎のコンボボックスにイベントを設定する

引き続き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行目のコンボボックス:" &amp; cb.SelectedItem)
        ElseIf cb.EditingControlRowIndex = 1 Then
            MessageBox.Show("2行目のコンボボックス:" &amp; cb.SelectedItem)
        ElseIf cb.EditingControlRowIndex = 2 Then
            MessageBox.Show("3行目のコンボボックス:" &amp; 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回で開くところですね。
まあなんとかなってよかったです。

また何かあれば記事にしようと思います。

ではでは。

 

Originally published at www.doraxdora.com

doraxdora

IT関係の仕事をしています/1985年生まれの東京在住/便利なサービスやツール漁りや料理などが好き/2017年~ブログやってます/自分でサービスとか作ってリリースしたい/何かありましたらお気軽にDMどうぞ

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント