Вам нужно будет создать стек отмены. Заполняйте этот стек после каждого действия редактирования таблицы данных достаточным количеством информации, чтобы отменить его. Затем предоставьте механизм для выполнения действий в стеке в обратном порядке.
скажем, в вашей таблице есть два столбца: int c1 и varchar c2. Просто для намека, вот несколько примеров классов.
struct ColData{
int c1;
string c2;
};
class Action {
public abstract bool Undo(){}
public abstract bool Redo(){}
}
class AddAction : Action{
ColData data;
public AddAction(ColData d){data = d;}
public override bool Undo(){
//remove the row
//identify it with info from local field 'data'
}
public override bool Redo(){
//add the row with info from local field 'data'
}
}
//other actions like Delete, Update
И так далее для всех других действий. Для редактирования действий вам может понадобиться два набора значений столбцов: старый и новый, чтобы вы могли повторить изменение туда и обратно.
Каждый раз, когда у вас есть изменения, вы помещаете соответствующее Действие в стек действий. Когда вас попросят отменить, вы извлекаете его из стека отмены, вызываете метод Undo и помещаете его в стек повторного выполнения. Если вас попросили повторить какое-либо действие, вы выскользнули из стека повторов, вызвали Redo и нажали, чтобы отменить стек.
Когда у вас есть другое новое действие, вы должны очистить свой стек повторного выполнения и перенести новое действие в стек отмены.