Функция отмены последнего действия отменяет все действия, кроме последнего

На форме отрисовывается TabControl с DataGridView внутри. При клике на любую ячейку выпадает меню. Я написал функцию для отмены последнего действия, однако она убирает вообще все, что было в других ячейках, кроме последней заполненной

Функция отмены действия:

 private void UndoChanges()
        {
            foreach (var pair in editedCellsByGrid)
            {
                DataGridView dataGridView = pair.Key;

                foreach (var cellEntry in pair.Value)
                {
                    DataGridViewCell cell = cellEntry.Key;
                    Stack<object> valueHistory = cellEntry.Value;

                    if (valueHistory.Count > 1)
                    {
                        valueHistory.Pop(); // Убираем текущее значение
                        object previousValue = valueHistory.Peek();
                        cell.Value = previousValue;
                    }
                    else
                    {
                        cell.Value = null; // Если история пуста, убираем значение
                    }
                }
            }
        }

editedCellsByGrid это Dictionary, который хранит историю изменений каждой ячейки Заполняю я его так:

private void dataGrieView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            DataGridView dataGridView = (DataGridView)sender;

            if (!editedCellsByGrid.ContainsKey(dataGridView))
            {
                editedCellsByGrid[dataGridView] = new Dictionary<DataGridViewCell, Stack<object>>();
            }

            DataGridViewCell editedCell = dataGridView[e.ColumnIndex, e.RowIndex];

            if (!editedCellsByGrid[dataGridView].ContainsKey(editedCell))
            {
                editedCellsByGrid[dataGridView][editedCell] = new Stack<object>();
            }

            editedCellsByGrid[dataGridView][editedCell].Push(editedCell.Value);
        }

Ответы (1 шт):

Автор решения: rotabor
 private void UndoChanges()
        {
            foreach (var pair in editedCellsByGrid)
            {
                DataGridView dataGridView = pair.Key;
// это что, ключом в editedCellsByGrid является целый DataGridView? В таком случае,
// в editedCellsByGrid всего один элемент. Но не это причина проблемы.

                foreach (var cellEntry in pair.Value)
// а вот тут проход по всем ячейкам в pair.Value, которое тоже, судя по всему, словарь
// вот здесь и есть проблема. Нужно просто выбирать из pair.Value текущую ячейку
// и работать только с её историей.
                {
                    DataGridViewCell cell = cellEntry.Key;
                    Stack<object> valueHistory = cellEntry.Value;

                    if (valueHistory.Count > 1)
                    {
                        valueHistory.Pop(); // Убираем текущее значение
                        object previousValue = valueHistory.Peek();
                        cell.Value = previousValue;
                    }
                    else
                    {
                        cell.Value = null; // Если история пуста, убираем значение
// а вот тут все ячейки, у которых нет истории, обнуляются.
// а сюда попадают вообще все ячейки, потому что событие CellValueChanged
// вызывается при заполнении DataGridView
                    }
                }
            }
        }
→ Ссылка