Функция отмены последнего действия отменяет все действия, кроме последнего
На форме отрисовывается 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
}
}
}
}