BETA

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

投稿日:2019-09-11
最終更新:2019-09-11
※この記事は外部サイト(https://www.doraxdora.com/blog/2017/12/15/...)からのクロス投稿です

引き続き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回で開くところですね。
まあなんとかなってよかったです。

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

ではでは。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@doraxdoraの技術ブログ 主に Java, C#, Python, Javascript の記事を載せていく予定。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!