找回密码
 立即注册

QQ登录

只需一步,快速开始

Joestar.Xu SpreadJS 开发认证

超级版主

62

主题

9716

帖子

1万

积分

超级版主

Rank: 8Rank: 8

积分
12760

SpreadJS 认证SpreadJS 高级认证

Joestar.Xu SpreadJS 开发认证
超级版主   /  发表于:2024-9-27 16:46  /   查看:242  /  回复:0
在SpreadJS中,bindingPath 是一种用于绑定数据的路径。然而在某些情况下,我们可能需要快速清除这个 bindingPath 属性,以便重新进行数据绑定或者进行其他操作。传统的方法可能需要通过复杂的代码或者手动操作来实现,这不仅效率低下,而且容易出错。因此,我们需要一种更加便捷的方法来实现清除 bindingPath 的功能。


本文将介绍通过重写右键菜单的“清除内容”选项,当用户点击这个选项时,能够快速清除当前选中单元格区域内的所有单元格的 bindingPath。如下图:

image.png421613768.png

要实现这个需求,只需要重新定义一个Command,然后将原来的Command替换掉即可。

  1. let myClearContents = {
  2.   canUndo: true,
  3.   name: "myClearContents",
  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.       let sheet = context.getSheetFromName(options.sheetName);

  12.       sheet.suspendPaint();
  13.       sheet.suspendEvent();
  14.       sheet.suspendCalcService();

  15.       options.cmd = "myClearContents";
  16.       let selections = sheet.getSelections();
  17.       selections.forEach((e) => {
  18.         let { row, col, rowCount, colCount } = e;
  19.         sheet.clear(
  20.           row,
  21.           col,
  22.           rowCount,
  23.           colCount,
  24.           GC.Spread.Sheets.SheetArea.viewport,
  25.           GC.Spread.Sheets.StorageType.data
  26.         );
  27.         sheet.clear(
  28.           row,
  29.           col,
  30.           rowCount,
  31.           colCount,
  32.           GC.Spread.Sheets.SheetArea.viewport,
  33.           GC.Spread.Sheets.StorageType.bindingPath
  34.         );
  35.       });

  36.       sheet.resumePaint();
  37.       sheet.resumeEvent();
  38.       sheet.resumeCalcService();

  39.       Commands.endTransaction(context, options);
  40.       return true;
  41.     }
  42.   },
  43. };

  44. spread.commandManager().register("myClearContents", myClearContents);

  45. let oldOpenMenu = spread.contextMenu.onOpenMenu;
  46. spread.contextMenu.onOpenMenu = function (
  47.   menuData,
  48.   itemsDataForShown,
  49.   hitInfo,
  50.   spread
  51. ) {
  52.   oldOpenMenu.apply(this, arguments);

  53.   itemsDataForShown.forEach(function (item, index) {
  54.     if (item && item.name === "gc.spread.contextMenu.clearContents") {
  55.       item.command = "myClearContents";
  56.     }
  57.   });
  58. };
复制代码


为了避免撤销栈重做栈的显示信息有误,还需要修改undoList和redoList:

  1. let undoList = GC.Spread.Sheets.Designer.getCommand(
  2.   GC.Spread.Sheets.Designer.CommandNames.UndoList
  3. );
  4. let redoList = GC.Spread.Sheets.Designer.getCommand(
  5.   GC.Spread.Sheets.Designer.CommandNames.RedoList
  6. );
  7. redoList.commandMap["myClearContents"] = "清除内容";
  8. undoList.commandMap["myClearContents"] = "清除内容";
  9. designerConfig.commandMap = {};
  10. designerConfig.commandMap[GC.Spread.Sheets.Designer.CommandNames.UndoList] =
  11.   undoList;
  12. designerConfig.commandMap[GC.Spread.Sheets.Designer.CommandNames.RedoList] =
  13.   redoList;
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部