【VB.NET】データグリッドビューで行毎のコンボボックスにイベントを設定する
おはようございます。
引き続きVB.NETの話し。
今回はデータグリッドビューに配置したコンボボックスにイベントを設定するといったことをやってみます。
プログラムは前回のものを流用します。
スポンサーリンク
プログラムの修正
新規メソッド追加
ドロップダウンが(選択されて)閉じられた際の処理を新規メソッドで定義
Form1.vb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | ''' <summary> ''' データグリッドビューのコンボボックスが閉じられた際のイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> PrivateSubdataGridViewComboBox_DropDownClosed(ByValsender AsObject, ByValeAsEventArgs) Dimcb AsDataGridViewComboBoxEditingControl= DirectCast(sender,DataGridViewComboBoxEditingControl) cb.EditingControlDataGridView.NotifyCurrentCellDirty(True) ' 行ごとに処理を変更する If cb.EditingControlRowIndex=0Then MessageBox.Show("1行目のコンボボックス:"&cb.SelectedItem) ElseIf cb.EditingControlRowIndex=1Then MessageBox.Show("2行目のコンボボックス:"&cb.SelectedItem) ElseIf cb.EditingControlRowIndex=2Then MessageBox.Show("3行目のコンボボックス:"&cb.SelectedItem) EndIf cb.EditingControlDataGridView.EndEdit() EndSub |
ここで、行インデックスや、列インデックス、または名前などを判定して処理を分岐します。
新規イベント追加

デザイナー画面でデータグリッドビューを選択し、プロパティ画面から対象のイベントを作成します。
データグリッドビューのセル内に設置したコンボボックスの内容が表示された際に、ドロップダウンが(選択されて)閉じられたイベントを追加します。
From1.vb
1 2 3 4 5 6 7 8 9 10 11 | ''' <summary> ''' 編集中コントロールが表示されている際のイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> PrivateSubdgv_EditingControlShowing(sender AsObject,eAsDataGridViewEditingControlShowingEventArgs)Handlesdgv.EditingControlShowing Dimcb=TryCast(e.Control,DataGridViewComboBoxEditingControl) If cb Is NothingThen Return RemoveHandlercb.DropDownClosed,AddressOfdataGridViewComboBox_DropDownClosed AddHandlercb.DropDownClosed,AddressOfdataGridViewComboBox_DropDownClosed EndSub |
既存処理の修正
データグリッド内のコンボボックスを選択した際に、
同じコンボボックスを連続でクリックすると正しく開かない問題が発覚したため既存の処理も修正。
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 | ''' <summary> ''' データグリッドビューセルクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> PrivateSubdgv_CellClick(sender AsObject,eAsDataGridViewCellEventArgs)Handlesdgv.CellClick Dimdgv AsDataGridView=CType(sender,DataGridView) gridComboHandle(dgv,e) EndSub ''' <summary> ''' データグリッドビューのコンボボックス制御 ''' </summary> ''' <param name="dgv"></param> ''' <param name="e"></param> PrivateSubgridComboHandle(dgv AsDataGridView,eAsDataGridViewCellEventArgs) ' 対象の列だった場合 If dgv.Columns(e.ColumnIndex).Name="col3"Then SendKeys.SendWait("{F4}") EndIf EndSub |
データグリッドビューのセルエンターイベントで処理していたのを、
セルクリックに変更して、更に「SendKey.Send」を「SendKey.SendWait」に変更。
起動してみる

起動後の画面です。

コンボボックスを選択します。

イベントが処理され、メッセージボックスが表示されました。
まとめ
データグリッドビューにコンポーネントを配置するってよくある話しだと思うんですが、何で標準でもっと便利にしてくれないんでしょうかね。
ちょっとハマった部分は、コンボボックスを1回で開くところですね。
まあなんとかなってよかったです。
また何かあれば記事にしようと思います。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません