【VB.NET】データグリッドビューを動的に作成して行毎に違う内容のコンボボックスを表示する
おはようございます。
ちょっと仕事の関係でVB.NETを使う機会があったので、備忘的な記事になります。
完全にデータグリッドビューの使い方からは外れてしまうのかもしれませんが、
行ごとに別の内容のコンボボックスを表示するといったことをやりました。
まずはサンプルプロジェクトの作成から。
スポンサーリンク
プロジェクトの新規作成

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

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

作成後はデザイナー画面が表示されます。
とりあえずプロジェクトの作成はこれで完了です。
データグリッドビューの配置

ツールボックスから「DataGridView」を選択して画面に配置します。
サイズなんかはとりあえず適当で大丈夫です。
名前の設定
プロパティから、「Name」の項目に「dgv」を設定しておきます。
(コードビハインドから操作する際にこの項目を使用します)
イベントの追加

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

また、データグリッドビューのセルに設置するコンボボックスのために、
「CellEnter」の項目もイベントを追加しておきます。
処理の実装
Form1.vb(コード)に、プログラムを記述します。
ロードイベント
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | ''' <summary> ''' フォームロードイベント. ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> PrivateSubForm1_Load(sender AsObject,eAsEventArgs)HandlesMyBase.Load DimmainList AsString()={"ユーザー","集客","行動","コンバージョン"} DimuserList AsString()={"アクティブユーザー","ライフタイムバリュー","コポート分析"} DimsyukyakuList AsString()={"全てのトラフィック","AdWords","Search Console"} DimkoudouList AsString()={"行動フロー","サイトコンテンツ","サイトの速度"} ' データグリッドの設定 dgv.AllowUserToAddRows=False dgv.AllowUserToResizeRows=False dgv.AllowUserToResizeColumns=False dgv.RowHeadersVisible=False ' ヘッダースタイル定義(共通) DimheaderStyle AsNewDataGridViewCellStyle() headerStyle.Alignment=DataGridViewContentAlignment.MiddleCenter ' チェックボックス列追加 DimcheckCol AsDataGridViewTextBoxColumn=NewDataGridViewTextBoxColumn() checkCol.HeaderCell.Style=headerStyle checkCol.HeaderText="選択" checkCol.Name="col1" checkCol.DataPropertyName="col1" checkCol.Width=40 dgv.Columns.Add(checkCol) ' スタイル設定 DimcheckStyle AsNewDataGridViewCellStyle() checkStyle.Alignment=DataGridViewContentAlignment.MiddleCenter checkCol.DefaultCellStyle=checkStyle ' テキスト列追加 DimtextCol AsDataGridViewTextBoxColumn=NewDataGridViewTextBoxColumn() textCol.HeaderCell.Style=headerStyle textCol.HeaderText="メニュー" textCol.Name="col2" textCol.DataPropertyName="col2" textCol.Width=120 dgv.Columns.Add(textCol) ' コンボボックス列の追加 DimcbCol AsDataGridViewTextBoxColumn=NewDataGridViewTextBoxColumn() cbCol.HeaderCell.Style=headerStyle cbCol.HeaderText="項目" cbCol.Name="col3" cbCol.DataPropertyName="col3" cbCol.Width=150 dgv.Columns.Add(cbCol) DimiAsShort Fori=0To mainList.Length-1 ' 行追加 dgv.Rows.Add() ' チェックボックス Dimchk AsNewDataGridViewCheckBoxCell() chk.Value=False dgv(0,i)=chk ' テキストボックス Dimtxt AsNewDataGridViewTextBoxCell() txt.Value=mainList(i) dgv(1,i)=txt Dimcmb AsNewDataGridViewComboBoxCell() 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 ' コンボボックスを設定しない EndIf Next EndSub |
データグリッドビューのセルエンターイベント
1 2 3 4 5 6 7 8 9 10 | ''' <summary> ''' データグリッドビューセルエンターイベント. ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> PrivateSubdgv_CellEnter(sender AsObject,eAsDataGridViewCellEventArgs)Handlesdgv.CellEnter ' データグリッドビューを取得 Dimdgv AsDataGridView=CType(sender,DataGridView) gridComboHandle(dgv,e) EndSub |
データグリッドビューのコンボボックス制御
通常だと、データグリッドビューに設置したコンボボックスは一回のクリックで開いてくれない。
それをなんとかするための措置。
1 2 3 4 5 6 7 8 9 10 11 12 | ''' <summary> ''' データグリッドビューのコンボボックス制御 ''' </summary> ''' <param name="dgv"></param> ''' <param name="e"></param> PrivateSubgridComboHandle(dgv AsDataGridView,eAsDataGridViewCellEventArgs) ' 対象のグリッドであれば If dgv.Columns(e.ColumnIndex).Name="col3"Then SendKeys.Send("{F4}") EndIf EndSub |
起動してみる

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

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

2行目のコンボボックスの内容です。
ひとまず目的のことはできましたね。
まとめ
本来であれば、データグリッドビューではなく他のコントローラで実現すべきところなんだと思いますが、顧客からの要望なんかでやらざるをえない場合もありますよね。
何かの参考になれば。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません