找回密码
 立即注册

QQ登录

只需一步,快速开始

allen-an

注册会员

16

主题

45

帖子

145

积分

注册会员

积分
145
allen-an
注册会员   /  发表于:2022-11-10 11:04  /   查看:3634  /  回复:17
1金币
本帖最后由 Ellia.Duan 于 2022-11-14 09:41 编辑

我使用了 sheet.fillAuto()这个方法操作后按 ctrl+z 快捷键不能实现撤销功能。请问跟我使用注册快捷键实现自动填充有关系吗?怎么解决呢?
  1. spread.commandManager().register('fillDown', () => {
  2.     spread.suspendEvent();
  3.     const sheet = spread.getActiveSheet();
  4.     const { row, col, rowCount, colCount } = sheet.getSelections()[0];
  5.     let startRange: GC.Spread.Sheets.Range, wholeRange: GC.Spread.Sheets.Range;
  6.     for (let i = 0; i < colCount; i++) {
  7.       startRange = new GC.Spread.Sheets.Range(row, col + i, 1, 1);
  8.       wholeRange = new GC.Spread.Sheets.Range(row, col + i, rowCount, 1);
  9.       sheet.fillAuto(startRange, wholeRange, {
  10.         fillType: 0,
  11.         series: 0,
  12.         direction: 3,
  13.       });
  14.     }
  15.     spread.resumeEvent();
  16.   });
  17. spread.commandManager().setShortcutKey('fillDown', 68, false, true, true, false);
复制代码


最佳答案

查看完整内容

明白您的意思了,这里用快捷键执行后无法撤销,是因为用快捷键执行的时候,options里缺少了cmd,可以自己加一下 还有一种办法,就是可以把快捷键绑定到命令A,然后在命令A里执行命令B,这里命令B是您真正要执行的事情,因为手动执行时可以保证传入的参数是全的,这样ctrl+z也就可以撤销了,两种方法都可以

17 个回复

倒序浏览
最佳答案
最佳答案
xcymoo
超级版主   /  发表于:2022-11-10 11:04:05
来自 16#
allen-an 发表于 2022-11-10 17:05
我已经把这个 command 绑定到我设置的快捷键上了,按快捷键不就等于执行命令吗?

明白您的意思了,这里用快捷键执行后无法撤销,是因为用快捷键执行的时候,options里缺少了cmd,可以自己加一下
1668073598788.png922474975.png

还有一种办法,就是可以把快捷键绑定到命令A,然后在命令A里执行命令B,这里命令B是您真正要执行的事情,因为手动执行时可以保证传入的参数是全的,这样ctrl+z也就可以撤销了,两种方法都可以

自定义命令.zip

1.34 KB, 下载次数: 276

回复 使用道具 举报
xcymoo
超级版主   /  发表于:2022-11-10 11:26:18
2#
您看一下这个文档,register第二个参数可以传入一个对象,里面的excute是您目前写的函数,上面还有一个canUndo的属性,可以加上去试试
https://demo.grapecity.com.cn/sp ... andManager#register
回复 使用道具 举报
allen-an
注册会员   /  发表于:2022-11-10 14:33:13
3#
xcymoo 发表于 2022-11-10 11:26
您看一下这个文档,register第二个参数可以传入一个对象,里面的excute是您目前写的函数,上面还有一个canU ...

我加上了,还是不能撤销
回复 使用道具 举报
allen-an
注册会员   /  发表于:2022-11-10 14:36:59
4#
allen-an 发表于 2022-11-10 14:33
我加上了,还是不能撤销
  1. spread.commandManager().register(
  2.           'fillDown',
  3.           {
  4.             canUndo: true,
  5.             execute: () => {
  6.               spread.suspendEvent();
  7.               const sheet = spread.getActiveSheet();
  8.               const { row, col, rowCount, colCount } = sheet.getSelections()[0];
  9.               let startRange, wholeRange;
  10.               for (let i = 0; i < colCount; i++) {
  11.                 startRange = new GC.Spread.Sheets.Range(row, col + i, 1, 1);
  12.                 wholeRange = new GC.Spread.Sheets.Range(row, col + i, rowCount, 1);
  13.                 sheet.fillAuto(startRange, wholeRange, {
  14.                   fillType: 0,
  15.                   series: 0,
  16.                   direction: 3,
  17.                 });
  18.               }
  19.               spread.resumeEvent();
  20.             },
  21.           },
  22.           68,
  23.           false,
  24.           true,
  25.           true,
  26.           false
  27.   );
复制代码
回复 使用道具 举报
allen-an
注册会员   /  发表于:2022-11-10 15:31:35
5#

这是操作

iShot_2022-11-10_14.31.37.mp4.zip

1.57 MB, 下载次数: 302

回复 使用道具 举报
xcymoo
超级版主   /  发表于:2022-11-10 15:34:54
6#

execute函数里面,应该有如下部分,您参考一下


var Commands = GC.Spread.Sheets.Commands;
if (isUndo) {
// 执行撤销的逻辑
    Commands.undoTransaction(context, options);
    return true;
} else {
// 非撤销逻辑

// 这里是需要命令对应的事物
    Commands.startTransaction(context, options);

// 事物开始和结束的中间,写命令的逻辑

// 事物结束
    Commands.endTransaction(context, options);
    return true;
}

回复 使用道具 举报
xcymoo
超级版主   /  发表于:2022-11-10 15:48:37
7#
本帖最后由 xcymoo 于 2022-11-10 15:50 编辑
  1.         spread.commandManager().register(
  2.             'fillDown',
  3.             {
  4.                 canUndo: true,
  5.                 execute: (context, options, isUndo) => {
  6.                     var Commands = GC.Spread.Sheets.Commands;
  7.                     spread.suspendEvent();
  8.                     if (isUndo) {
  9.                         Commands.undoTransaction(context, options);
  10.                         spread.resumeEvent();
  11.                         return true
  12.                     } else {
  13.                         Commands.startTransaction(context, options);
  14.                         const sheet = spread.getActiveSheet();
  15.                         const { row, col, rowCount, colCount } = sheet.getSelections()[0];
  16.                         let startRange, wholeRange;
  17.                         for (let i = 0; i < colCount; i++) {
  18.                             startRange = new GC.Spread.Sheets.Range(row, col + i, 1, 1);
  19.                             wholeRange = new GC.Spread.Sheets.Range(row, col + i, rowCount, 1);
  20.                             sheet.fillAuto(startRange, wholeRange, {
  21.                                 fillType: 0,
  22.                                 series: 0,
  23.                                 direction: 3,
  24.                             });
  25.                         }
  26.                         Commands.endTransaction(context, options);
  27.                         spread.resumeEvent();
  28.                         return true
  29.                     }
  30.                 },
  31.             },
  32.             68,
  33.             false,
  34.             true,
  35.             true,
  36.             false

  37.         );
复制代码
帮您修改了一下,您看看
回复 使用道具 举报
allen-an
注册会员   /  发表于:2022-11-10 15:54:37
8#
xcymoo 发表于 2022-11-10 15:34
execute函数里面,应该有如下部分,您参考一下

没有太懂这个,意思是执行撤销要自己实现?option 是什么内容?
回复 使用道具 举报
xcymoo
超级版主   /  发表于:2022-11-10 16:01:31
9#
allen-an 发表于 2022-11-10 15:54
没有太懂这个,意思是执行撤销要自己实现?option 是什么内容?

Commands.undoTransaction会回退事物开始到事物结束的操作,只要写固定的事物开始、结束、回退,就可以了,把业务逻辑写到事物开始和结束的中间,就可以自动撤销了
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部