ユーザが画面上のデータを変更したら初めて登録ボタンを押せるようにするという要件は結構あると思います。
今回はグリッド上でユーザが値を変更したことを知る方法です。
通常のセルの場合は、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