Определение, когда ячейка в DataGridView изменилась, но только после выхода из режима редактирования. - PullRequest
0 голосов
/ 16 октября 2018

Я прочитал несколько постов на эту тему, но ни один из них, похоже, не соответствует моей конкретной ситуации.Я в основном хочу выполнить некоторый код для копирования данных из ячейки DataGridView, как только пользователь внес какие-либо изменения.Но, в частности, я хочу получить значение только после того, как пользователь завершил редактирование ячейки И, если значение ячейки на самом деле отличается (например, пользователь не отменил редактирование).Требуемое поведение идентично тому, как Excel обновляет формулы для ячеек только после того, как пользователь фактически обновил формулу для ячейки.Итак, вот код, с которого я начинаю:

private void MyDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    // Exit this event procedure if no rows have been added to the DataGridView yet (during program initialization)
    if (e.RowIndex < 0)
    {
        return;
    }

    // Get an object reference to the current Value cell
    DataGridViewCell cell = (DataGridViewCell)MyDataGridView.Rows[e.RowIndex].Cells[1];

    // Do other stuff with the cell data here   
}

private void MyDataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    // Force the CellValueChanged event to trigger for the control if the current cell's value has changed
    if (MyDataGridView.IsCurrentCellDirty)
    {
        MyDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

Он работает так, что событие CellValueChanged срабатывает каждый раз, когда выполняется редактирование.Однако событие возникает каждый раз, когда пользователь вводит ключ в режиме редактирования, и я просто хочу, чтобы оно срабатывало один раз после выхода пользователя из режима редактирования (и при условии, что изменения были сделаны и не были отменены).Каков наилучший способ приблизиться к этому?Я также посмотрел на событие CellEndEdit, которое, кажется, немного приблизило меня, но у меня все еще нет способа определить, было ли редактирование зафиксировано или отменено.Какой лучший / рекомендуемый подход для этого?

1 Ответ

0 голосов
/ 16 октября 2018

ОК, я нашел простое решение своей проблемы.Чтобы это работало, все, что вам нужно сделать, это использовать события CellBeginEdit и CellEndEdit.Я создал глобальную переменную под названием CellValue, которая устанавливается на содержимое ячейки внутри события CellBeginEdit.Позднее это сохраненное значение сверяется с текущим значением ячейки в событии CellEndEdit.Если они отличаются, то я могу выполнить код, который мне нужен для обработки недавно измененных данных в ячейке.

Я знаю, что этот подход может не работать для каждой ситуации, но я просто подумал, что поделюсь этим для всех, кто работаетв ту же проблему.Вот быстрый пример кода, иллюстрирующий то, что я сделал:

// Temporarily holds the value of a cell in the DataGridView once a cell has begun to be edited.
// The value in this variable is then compared to the value of the cell after the edit is complete to see if the data chagned before updating the controlParameters object
object CellValue;

private void MyDataGridView_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    // Set this variable to the current cell's value to compare later to see if it's contents have changed
    this.CellValue = MyDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
}

private void MyDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    // Exit this event procedure if no rows have been added to the DataGridView yet (during program initialization)
    if (e.RowIndex < 0)
    {
        return;
    }

    // Proceed only if the value in the current cell has been changed since it went into edit mode
    if (this.CellValue != MyDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value)
    {
        // Do your cell data manipulation here
    }
}
...