BETA

【VB.NET】データグリッドビューを動的に作成して行毎に違う内容のコンボボックスを表示する

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

ちょっと仕事の関係でVB.NETを使う機会があったので、備忘的な記事になります。

完全にデータグリッドビューの使い方からは外れてしまうのかもしれませんが、
行ごとに別の内容のコンボボックスを表示するといったことをやりました。

まずはサンプルプロジェクトの作成から。

プロジェクトの新規作成

VisualStudio2017 を起動し、上部メニューの「ファイル」>「新規作成」>「プロジェクト」を選択します。

新しいプロジェクト作成ウィザードが表示されるので、
「Visual Basic」>「Windowsフォームアプリケーション」を選択、名前を入力して「OK」ボタンをクリックします。

作成後はデザイナー画面が表示されます。

とりあえずプロジェクトの作成はこれで完了です。

データグリッドビューの配置

ツールボックスから「DataGridView」を選択して画面に配置します。
サイズなんかはとりあえず適当で大丈夫です。

名前の設定

プロパティから、「Name」の項目に「dgv」を設定しておきます。
(コードビハインドから操作する際にこの項目を使用します)

イベントの追加

データグリッドビューを選択した状態でプロパティから、イベントメニューを選択、
「Load」の項目をダブルクリックして起動時の処理を追加します。

また、データグリッドビューのセルに設置するコンボボックスのために、
「CellEnter」の項目もイベントを追加しておきます。

処理の実装

Form1.vb(コード)に、プログラムを記述します。

ロードイベント

    ''' <summary>  
    ''' フォームロードイベント.  
    ''' </summary>  
    ''' <param name="sender"></param>  
    ''' <param name="e"></param>  
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load  

        Dim mainList As String() = {"ユーザー", "集客", "行動", "コンバージョン"}  
        Dim userList As String() = {"アクティブユーザー", "ライフタイムバリュー", "コポート分析"}  
        Dim syukyakuList As String() = {"全てのトラフィック", "AdWords", "Search Console"}  
        Dim koudouList As String() = {"行動フロー", "サイトコンテンツ", "サイトの速度"}  

        ' データグリッドの設定  
        dgv.AllowUserToAddRows = False  
        dgv.AllowUserToResizeRows = False  
        dgv.AllowUserToResizeColumns = False  
        dgv.RowHeadersVisible = False  

        ' ヘッダースタイル定義(共通)  
        Dim headerStyle As New DataGridViewCellStyle()  
        headerStyle.Alignment = DataGridViewContentAlignment.MiddleCenter  

        ' チェックボックス列追加  
        Dim checkCol As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn()  
        checkCol.HeaderCell.Style = headerStyle  
        checkCol.HeaderText = "選択"  
        checkCol.Name = "col1"  
        checkCol.DataPropertyName = "col1"  
        checkCol.Width = 40  
        dgv.Columns.Add(checkCol)  

        ' スタイル設定  
        Dim checkStyle As New DataGridViewCellStyle()  
        checkStyle.Alignment = DataGridViewContentAlignment.MiddleCenter  
        checkCol.DefaultCellStyle = checkStyle  

        ' テキスト列追加  
        Dim textCol As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn()  
        textCol.HeaderCell.Style = headerStyle  
        textCol.HeaderText = "メニュー"  
        textCol.Name = "col2"  
        textCol.DataPropertyName = "col2"  
        textCol.Width = 120  
        dgv.Columns.Add(textCol)  

        ' コンボボックス列の追加  
        Dim cbCol As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn()  
        cbCol.HeaderCell.Style = headerStyle  
        cbCol.HeaderText = "項目"  
        cbCol.Name = "col3"  
        cbCol.DataPropertyName = "col3"  
        cbCol.Width = 150  
        dgv.Columns.Add(cbCol)  

        Dim i As Short  
        For i = 0 To mainList.Length - 1  

            ' 行追加  
            dgv.Rows.Add()  

            ' チェックボックス  
            Dim chk As New DataGridViewCheckBoxCell()  
            chk.Value = False  
            dgv(0, i) = chk  

            ' テキストボックス  
            Dim txt As New DataGridViewTextBoxCell()  
            txt.Value = mainList(i)  
            dgv(1, i) = txt  

            Dim cmb As New DataGridViewComboBoxCell()  
            If (mainList(i) = "ユーザー") Then  
                cmb.Items.AddRange(userList)  
                dgv(2, i) = cmb  
                dgv(2, i).Value = userList(0)  
            ElseIf (mainList(i) = "集客") Then  
                cmb.Items.AddRange(syukyakuList)  
                dgv(2, i) = cmb  
                dgv(2, i).Value = syukyakuList(0)  
            ElseIf (mainList(i) = "行動") Then  
                cmb.Items.AddRange(koudouList)  
                dgv(2, i) = cmb  
                dgv(2, i).Value = koudouList(0)  
            ElseIf (mainList(i) = "コンバージョン") Then  
                ' コンボボックスを設定しない  
            End If  
        Next  
    End Sub  

データグリッドビューのセルエンターイベント

    ''' <summary>  
    ''' データグリッドビューセルエンターイベント.  
    ''' </summary>  
    ''' <param name="sender"></param>  
    ''' <param name="e"></param>  
    Private Sub dgv_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellEnter  
        ' データグリッドビューを取得  
        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.Send("{F4}")  
        End If  

    End Sub  

起動してみる

ひとまずグリッドに内容が表示されました。

1行目のコンボボックスの内容です。

2行目のコンボボックスの内容です。

ひとまず目的のことはできましたね。

まとめ

本来であれば、データグリッドビューではなく他のコントローラで実現すべきところなんだと思いますが、顧客からの要望なんかでやらざるをえない場合もありますよね。

何かの参考になれば。

ではでは。

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

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

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

よく一緒に読まれる記事

0件のコメント

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