问题描述
我有一个使用 sqlite 数据库作为模型的 c# 应用程序。撤消/重做功能部分完成;我被卡住了。
到目前为止:
当应用程序启动时,会创建一个表 undolog
(seq INTEGER,sql TEXT
),并将临时触发器添加到其他表中以将行插入到 undolog
中。 undolog
的每一行都包含执行撤消步骤所需的 sql 命令。
例如,对于表 Objects
(objId INTEGER,objName TEXT
),创建以下触发器。
插入后:
INSERT INTO undolog VALUES( NULL,'DELETE FROM Objects WHERE rowid='||new.rowid);
更新后:
INSERT INTO undolog VALUES( NULL,'UPDATE Objects SET objID='||quote(old.objID)||',objName='||quote(old.objName)||' WHERE rowid='||old.rowid)
删除前:
INSERT INTO undolog VALUES(NULL,'INSERT INTO Objects(rowid,objID,objName) VALUES('||old.rowid||','||quote(old.objID)||','||quote(old.objName)||')');
到目前为止一切都很好。当表被修改时,正确的行被插入到撤消日志中。如果我反向执行sql列的内容,表的修改就会被撤消。
我一直在关注精彩的 SQLite undo-redo example,但是当谈到实现撤消/重做堆栈时,我完全不明白。我完全迷路了。
我的 c# 代码中有一个漏洞,位于用户以他/她喜欢的任何顺序单击撤消和重做与 undolog
之间。这是我到目前为止所得到的:用户单击撤消,从最新的 undolog
行获取 sql,然后删除该行。执行sql。但是随后在 undolog
中创建了一个新行以响应撤消操作。这显然是错误的,但我不知道如何进一步。
这是一个使用 .net framework 4.7.2 的 windows 窗体应用程序。我正在使用 system.data.sqlite。在 c# 代码中构建查询并执行它们。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)