【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回で開くところですね。
まあなんとかなってよかったです。
また何かあれば記事にしようと思います。
ではでは。


 https://www.doraxdora.com/blog/2017/12/14/3439/
 https://www.doraxdora.com/blog/2017/12/14/3439/








ディスカッション
コメント一覧
まだ、コメントがありません