3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.Net)グリッドでチェックボックス列の値が変更されたことを知る

ユーザが画面上のデータを変更したら初めて登録ボタンを押せるようにするという要件は結構あると思います。

今回はグリッド上でユーザが値を変更したことを知る方法です。

通常のセルの場合は、DataGridView.CellValueChanged イベントを捕まえてやるだけで構わないようです。

ただイベントは値がコミットされたときに発生するので、セルのフォーカスを抜けるときに走ります。

たとえばチェックボックス列の場合などはセルにチェックを付けた瞬間にこのイベントが走るようにしてあげたほうがユーザビリティがあるでしょう。

その場合は、DataGridView.CurrentCellDirtyStateChanged イベントでデータをコミットしてやればいいようです。

詳しいことは、MSDN:DataGridView.CellValueChangedにあります。

サンプルソースは下記。プログラム内でグリッドの値を変更した場合は CellValueChanged を走らしたくないんですが、フラグ以外にいい方法ないもんですかね。

'セルが変更されたことを通知するイベント

Private Sub dgv_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.CellValueChanged

'm_blnFormLoadはフォームロード中かどうかのフラグ(InitializeComponent()でのセルの変更を無視するため)

'utcAccount は NetAdvantage という外部コントロールの UltraTabControl

'm_blnSetUserInGroupCheck はコード内からグリッドの値を変更しているかどうかのフラグ

 

'グループ所属のタブのときかつコンボボックスで選んでいるとき以外

If Not m_blnFormLoad AndAlso Me.utcAccount.SelectedTab.Equals(Me.utcAccount.Tabs("UserInGroup")) AndAlso Not m_blnSetUserInGroupCheck Then

'データが変更されたと判断

Me.btnSave.Enabled = True

End If

 

End Sub

 

Private Sub dgv_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgv.CurrentCellDirtyStateChanged

'ここでコミットすることで、ユーザがDataGridViewCheckBoxColumn列のチェックを変更したらすぐにCellValueChangedイベントが走るようにする

dgvUserInGroup.CommitEdit(DataGridViewDataErrorContexts.Commit)

End Sub