找回密码
 立即注册

QQ登录

只需一步,快速开始

[处理中] ctrl+z 撤回问题

Dtttax
高级会员   /  发表于:2024-6-5 11:02:38
11#
本帖最后由 Dtttax 于 2024-6-5 15:34 编辑

GC.Spread.Sheets.Commands.editCell.canUndo = false;  在editstarting   加入可以,但是体验感不好,另外能不能把其他表单的tag撤回也把值也撤回。只按一次ctrl+z.  另外如果假如在当前单元格输入值,同时给这个单元格加一个币种符号,这种情况能不能一次行撤回还原。
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-5 17:56:59
12#
您好,如果想要一次撤回还原的话,只能是将两个操作写在同一个命令中,否则是没有办法一次撤回的,您可以参考一下这个帖子中的内容:https://gcdn.grapecity.com.cn/showtopic-220415-1-1.html
回复 使用道具 举报
Dtttax
高级会员   /  发表于:2024-6-5 18:59:36
13#
本帖最后由 Dtttax 于 2024-6-6 10:10 编辑

两个问题:
1、合并成一个命令这个情况了解,但是有一个情况,比如单元格输入值了后加一个币种。这个时候只能在editended事件里面做,就导致了撤回值分两步,另外有没有办法在editended事件面合并。
2、另外注册了ctrl+z的事件之后重写方法感觉不生效。是不是不能阻止ctrl+z。
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-6 11:26:02
14#
您好,

1、这个没有办法,像您目前的这种需求,只能是把两个操作合并为一个Command去实现,才能实现一次撤销的效果,否则只能分两次操作(命令需要撤销,所以需要撤销两次;API无法撤销,但是会影响下次的输入)。

2、没太明白,您是想实现什么需求?阻止撤销的操作吗?
回复 使用道具 举报
Dtttax
高级会员   /  发表于:2024-6-6 14:27:59
15#
本帖最后由 Dtttax 于 2024-6-6 17:58 编辑

1、把两个操作合并为一个Command去实现,这个时候涉及到跨表单,一次撤销只能转一个sheetName.就像附件demo
newUndoDemo1.zip ,当前单元格输入值后设置了tag,同时在其他表单也做了操作,但是撤回不连续撤回。是不是一次撤回只能一个表单。
2、就是阻止撤销的操作。是否全用spread.options.allowUndo= false;

3、单元格输入值有没有办法也封成command 。或者模拟调用ctrl+z。比如我在editended里面再封装了一个command,做撤回的时候根据options的参数在回滚的事务里面做一次出发键盘的ctrl+z。

newUndoDemo1.zip

2.29 KB, 下载次数: 19

newUndoDemo.zip

2.29 KB, 下载次数: 16

回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-6 17:47:29
16#
您好,

1、正如之前所述,撤回时,每次只能撤回一个命令,无法一次性撤回多个命令,您在Demo中的EditEnded一次性执行了两次命令,所以撤回时也需要撤回两次。

2、阻止撤销可以使用spread.options.allowUndo = true;

3、单元格输入值已经有Command了,为:editCell(https://demo.grapecity.com.cn/sp ... s.Commands#editcell
回复 使用道具 举报
Dtttax
高级会员   /  发表于:2024-6-6 19:04:14
17#
本帖最后由 Dtttax 于 2024-6-7 10:07 编辑

1、我重注册一个空的editCell事件,然后把值在另外一个事务里面设置。如demo附件,这样输入值后一步撤回是否可以。
2、另外是不是一个command里面不能对其他sheet设置值或者tag,不然不能一次撤回当前表单和其他表单。如果要撤回只能撤回一个表单的操作.
3、如果我在command的里面加入一个sheet.autoFitRow(row) 这样是不是就会出现了两个command因为本身
[size=13.0667px]autoFitRow也是一个事务。

newUndoDemo.zip

2.67 KB, 下载次数: 23

回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-7 17:32:56
18#
您好,我这边做了一个命令的Demo,可以在编辑的时候同时给另一个sheet中的单元格添加tag,撤回时可以同时撤回输入和tag的设置,请参考:

let myEditCell = Object.assign({}, GC.Spread.Sheets.Commands.editCell);
myEditCell.canUndo = false;
spread.commandManager().register("myEditCell", myEditCell);

let test = {
  canUndo: true,
  name: "test",
  execute: function (context, options, isUndo) {
    options.sheetName = [
      spread.getSheet(0).name(),
      spread.getSheet(1).name(),
    ];

    let Commands = GC.Spread.Sheets.Commands;
    if (isUndo) {
      Commands.undoTransaction(context, options);
      return true;
    } else {
      Commands.startTransaction(context, options);

      let sheetName = options.sheetName[0];
      let { row, col, newValue, autoFormat } = options;
      spread.commandManager().execute({
        cmd: "myEditCell",
        sheetName,
        row,
        col,
        newValue,
        autoFormat,
      });

      let sheet2 = context.getSheet(1);
      sheet2.setTag(row, col, "tag:" + newValue);

      Commands.endTransaction(context, options);
      return true;
    }
  },
};

spread.commandManager().register("editCell", test);

document.querySelector("#button1").addEventListener("click", function () {
  spread.commandManager().execute({
    cmd: "editCell",
    sheetName: ["Sheet1", "Sheet2"],
    row: 1,
    col: 2,
    newValue: "red",
    autoFormat: true,
  });
});

是的,sheet.autoFitRow(row)是一个特殊的API,会生成撤销重做栈中的步骤。
回复 使用道具 举报
Dtttax
高级会员   /  发表于:2024-6-7 17:52:01
19#
本帖最后由 Dtttax 于 2024-6-11 09:51 编辑

1、这个demo是不是在最新版上面才能运行,v14好像不行,V14就是传的参数sheetName 不能是数组。以前的贴子也是提过两个表单用数组,但是V14好像不行。
2、如果用V17版本想在editended里面输入数据后再给其他表单的单元格打tag。是不是还是要注册一个空的editCell,sheetName参数传数组就可以了。感觉本身editended就是一个事务,所以在editended里面放一个事务就两个事务了。
image.png343907470.png
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-6-11 11:00:18
20#
您好,同样的代码我在V14中测试也是正常可以运行的,我测试的版本为14.0.2。

image.png462883910.png

关于问题2,您的意思是在editended事件中再执行一个命令去setTag吗?那样的话会再生成一个撤销栈,无法满足您的需求。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部