Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run Run CellEndEdit only when Cell ValueChanged in DataGridView

i want to run CellEndEdit only when value of cell is changed, tried putting

if (dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() == e.FormattedValue.ToString()) 
             return; 

in CellValidation event, the Cell Validation event does return but CellEndEdit also gets executed and updates, updated date & by fields when the user has only gone into edit mode and came out without changing the value cell.
By the time CellEndEdit is reached CellValue & Formatted Value are same so couldn't put this in CellEndEdit.

A trivial solution is to set a flag in CellValidation and return CellEndEdit when flag is set, but this appears to be a error-prone solution as there are about 10 girds on the form. So 10 flags?

like image 208
PUG Avatar asked Jan 17 '12 17:01

PUG


Video Answer


2 Answers

Instead of performing your tasks in CellEndEdit, put them in CellValueChanged. It is fired only when cell value is changed. Please note that it will fire when your DataGridViews are initially populated, but to handle that, you can put just one variable saying formInitialized or something, to make sure that you are not executing your CellEndEdit when you populate your data grids.

And to answer your question, there is no way to figure out if value is changed when CellEndEdit is fired, because it is always fired when cell gets out of edit mode. The only solution is, like you proposed, to store the old value externally, but you already noticed why is that bad (though it works really good in most of the cases).

like image 87
Aleksandar Vucetic Avatar answered Nov 09 '22 06:11

Aleksandar Vucetic


But if you want to compute the value edited, you can use the suggested issue by J.Fisher like:

Private Sub dgvHost_CellBeginEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles dgvHost.CellBeginEdit
    dgvHost.CurrentCell.Tag = dgvHost.CurrentCell.Value
End Sub

Private Sub dgvHost_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvHost.CellEndEdit
    If dgvHost.CurrentCell.Tag = dgvHost.CurrentCell.Value Then Exit Sub
    dgvHost.CurrentCell.Tag = Nothing
    'Do something like
    dgvHost.CurrentCell.Value = MD5(dgvHost.CurrentCell.Value)
End Sub
like image 29
Tof Avatar answered Nov 09 '22 04:11

Tof