找回密码
 立即注册

QQ登录

只需一步,快速开始

artman5545

中级会员

31

主题

93

帖子

901

积分

中级会员

积分
901
artman5545
中级会员   /  发表于:2018-9-30 11:01  /   查看:5812  /  回复:10
本帖最后由 artman5545 于 2018-9-30 11:04 编辑

    spread.commandManager().register("fillDesignManager", {
        canUndo: true,
        execute: function (context, options, isUndo) {
            var Commands = GC.Spread.Sheets.Commands;
            if (isUndo) {
                Commands.undoTransaction(context, options);
                return true;
            } else {
                Commands.startTransaction(context, options);
                var sheet = context.getSheetFromName(options.sheetName);
                sheet.setValue(options.row, options.col, data.currentUser, GC.Spread.Sheets.SheetArea.viewport);
                Commands.endTransaction(context, options);
                return true;
            }
        }
    });
撤销无效,我发现setValue后undo都无效

10 个回复

倒序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-9-30 11:45:15
沙发
本帖最后由 ClarkPan 于 2018-9-30 11:47 编辑

这是注册命令,而撤销针对的是整个命令的撤销而不是其中一句代码的撤销。在您的例子当[size=14.6667px]commandManager.execute执行过该命令后,可以用undo去撤销,而不是注册了这个命令后就可以撤销setValue了
回复 使用道具 举报
artman5545
中级会员   /  发表于:2018-9-30 14:33:40
板凳
那么使用sheet.setValue(row,col,value)后如何才能在ctrl+z得时候撤销赋值操作呢?
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-9-30 14:46:12
地板
将所有的setValue注册成命令,用命令commandManager.execute去执行

参考:
http://help.grapecity.com/spread ... nager~register.html
回复 使用道具 举报
artman5545
中级会员   /  发表于:2018-10-9 08:54:00
5#
本帖最后由 artman5545 于 2018-10-9 08:57 编辑
ClarkPan 发表于 2018-9-30 14:46
将所有的setValue注册成命令,用命令commandManager.execute去执行

参考:

下列代码实现效果模拟excel中"CTRL+;"填充当前时间快捷键,但是操作没办法撤销
  1.     spread.commandManager().register("fillNow",
  2.         {
  3.             canUndo: true,
  4.             execute: function (context, options, isUndo) {
  5.                 var Commands = GC.Spread.Sheets.Commands;
  6.                 if (isUndo) {
  7.                     Commands.undoTransaction(context, options);
  8.                     return true;
  9.                 } else {
  10.                     Commands.startTransaction(context, options);
  11.                     var ranges = sheet.getSelections();
  12.                     if (ranges.length > 0) {
  13.                         var range = ranges[0];
  14.                         var cell = sheet.getCell(range.row, range.col);
  15.                         if (!cell.locked()) {
  16.                             sheet.setValue(range.row, range.col, new Date());
  17.                         }
  18.                     }
  19.                     Commands.endTransaction(context, options);
  20.                     return true;
  21.                 }
  22.             }
  23.         }, 186, true, false, false, false);
复制代码
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-10-9 10:24:58
6#
您好,您的代码我这边试了,可以撤回,所以您说无法撤回我这边没能重现。

个人猜测,可能是您调用命令时参数传递有问题,execute方法接受的参数至少得有

cmd和sheetName两个参数,我把我调用命令的代码贴出来:

  1. var sheet = spread.getActiveSheet();

  2.             spread.commandManager().execute({
  3.                 cmd: "fillNow",
  4.                 sheetName: sheet.name()
  5.             });
复制代码


我把我的Demo整个上传给您,您把您执行命令与撤回操作的代码对比一下,

如果还无法找到问题,您可以把整个代码或者Demo上传上来我这边帮您筛查一下。

CommandRollback.html

5.08 KB, 下载次数: 78

回复 使用道具 举报
artman5545
中级会员   /  发表于:2018-10-9 11:04:28
7#
KevinChen 发表于 2018-10-9 10:24
您好,您的代码我这边试了,可以撤回,所以您说无法撤回我这边没能重现。

个人猜测,可能是您调用命令时 ...

额,请注意最后一行代码中参数186,true,我绑定的是快捷键ctrl+分号
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-10-9 11:27:29
8#
您好,抱歉刚才没有看仔细,我这边使用快捷键执行命令确实重现了问题,正在将此问题与研发部门沟通,稍后会给您答复。
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-10-10 11:40:06
9#
您好,对这个问题,解决方法如下:

在register命令时,声明的execute函数中加一句:

options.cmd = "fillNow";

代码如下:

  1. spread.commandManager().register("fillNow",
  2.             {
  3.                 canUndo: true,
  4.                 execute: function (context, options, isUndo) {
  5.                     var Commands = GC.Spread.Sheets.Commands;
  6.                     // 在此加cmd
  7.                     options.cmd = "fillNow";
  8.                     if (isUndo) {
  9.                         Commands.undoTransaction(context, options);
  10.                         return true;
  11.                     } else {
  12.                         Commands.startTransaction(context, options);
  13.                         var sheet = spread.getActiveSheet();
  14.                         var ranges = sheet.getSelections();
  15.                         if (ranges.length > 0) {
  16.                             var range = ranges[0];
  17.                             var cell = sheet.getCell(range.row, range.col);
  18.                             // if (!cell.locked()) {
  19.                                 sheet.setValue(range.row, range.col, new Date());
  20.                             // }
  21.                         }
  22.                         Commands.endTransaction(context, options);
  23.                         return true;
  24.                     }
  25.                 }
  26.             });
复制代码


所有自定义register命令时都建议添加此句。
回复 使用道具 举报
artman5545
中级会员   /  发表于:2018-10-11 11:45:03
10#
谢谢!加上确实有效,已按照你的意见处理
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部