引き続き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行目のコンボボックス:" & cb.SelectedItem)
ElseIf cb.EditingControlRowIndex = 1 Then
MessageBox.Show("2行目のコンボボックス:" & cb.SelectedItem)
ElseIf cb.EditingControlRowIndex = 2 Then
MessageBox.Show("3行目のコンボボックス:" & 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回で開くところですね。
まあなんとかなってよかったです。
また何かあれば記事にしようと思います。
ではでは。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント