Как запустить CellEndEdit только тогда, когда ячейка ValueChanged в DataGridView - PullRequest
5 голосов
/ 17 января 2012

я хочу запускать CellEndEdit только при изменении значения ячейки, попытался поставить

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

в событии CellValidation событие Cell Validation действительно возвращается, но CellEndEdit также выполняется и обновляет поля updated date & by, когда пользователь только перешел в режим редактирования и вышел без изменения ячейки значения.
К моменту достижения CellEndEdit значения CellValue и Formatted Value совпадают, поэтому не удалось поместить это в CellEndEdit.

Тривиальное решение состоит в том, чтобы установить флаг в CellValidation и вернуть CellEndEdit, когда флаг установлен, но это похоже на подверженное ошибкам решение, поскольку в форме имеется около 10 гирд. Итак, 10 флагов?

Ответы [ 5 ]

13 голосов
/ 17 января 2012

Вместо выполнения ваших задач в CellEndEdit поместите их в CellValueChanged. Он запускается только при изменении значения ячейки. Обратите внимание, что он будет срабатывать при первоначальном заполнении ваших DataGridView, но чтобы справиться с этим, вы можете поместить только одну переменную, скажем, formInitialized или что-то подобное, чтобы убедиться, что вы не выполняете свой CellEndEdit при заполнении своих сеток данных.

И чтобы ответить на ваш вопрос, нет способа выяснить, изменяется ли значение при запуске CellEndEdit, потому что оно всегда срабатывает, когда ячейка выходит из режима редактирования. Единственное решение, как вы и предлагали, - сохранять старое значение извне, но вы уже заметили, почему это плохо (хотя в большинстве случаев оно работает действительно хорошо).

0 голосов
/ 15 сентября 2016

Я сделал это так:

C #:

private void DynList_RowValidated(object sender, DataGridViewCellEventArgs e)
{
    if (ChangedRow == true) {
        ChangedRow = false;
        //Row Changed...
    }

}
bool ChangedRow;
private void DynList_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    ChangedRow = true;
}

VB.Net:

 Private Sub DynList_RowValidated(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
        If ChangedRow = True Then
            ChangedRow = False
            'Row Changed...
        End If

 End Sub
 Dim ChangedRow As Boolean
 Private Sub DynList_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
        ChangedRow = True
 End Sub

Я пытался сделать это за 1 час, потому что ни у кого не было решения для этого, поэтому я подумал, что это может быть полезно для других

0 голосов
/ 09 октября 2014

Но если вы хотите вычислить отредактированное значение, вы можете использовать предложенную проблему J.Fisher как:

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
0 голосов
/ 20 января 2014
 MessageBox.Show(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
0 голосов
/ 17 января 2012

Вы можете определенно получить это, поймав текущее значение ячейки в CellBeginEdit, а затем сравнив его с текущим значением ячейки в CellEndEdit. (Или используйте свой CellValidation трюк.)

Чтобы избежать «множественных флагов», вы можете использовать Dictionary<DataGridView,object>, чтобы вы могли ввести словарь с сеткой текущего события, а затем получить или установить соответствующее значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...