找回密码
 立即注册

QQ登录

只需一步,快速开始

Ellia.Duan SpreadJS 开发认证
超级版主   /  发表于:2023-12-19 11:46  /   查看:1980  /  回复:0
本帖最后由 Ellia.Duan 于 2024-10-22 17:31 编辑

在数据填报过程中,在一些场景中,不允许其他用户删除默认的单元格内容,这时候需要用权限控制单元格的状态。如何实现呢?除了传统给的解决方案,禁用快捷键。在v16版本推出的默认值功能,可以很好的解决这个问题。
我们先看下,如何用传统方式禁用删除操作。
一、禁用删除键

具体可以参考这篇文章:
https://gcdn.grapecity.com.cn/showtopic-153126-1-1.html
禁用之后,还发现了一个新的问题,点击当前单元格,右键菜单,发现菜单中存在“清除内容”选项,点击此菜单,同样可以把单元格中的内容删除掉。
image.png769267883.png
所以接下来的思路就是将这些菜单禁用掉或者重写。
二、重写右键菜单
重写可以参考下面的代码:
  1. var commandManager = spread.commandManager();
  2.                         var command = {
  3.                                 canUndo: true,
  4.                                 execute: function (context, options, isUndo) {
  5.                                         var Commands = GC.Spread.Sheets.Commands;
  6.                                         options.cmd = "CustomClearContents";
  7.                                         if (isUndo) {
  8.                                                 Commands.undoTransaction(context, options);
  9.                                                 return true
  10.                                         } else {
  11.                                                 Commands.startTransaction(context, options);

  12.                         let {row,col} = context.getActiveSheet().getSelections()[0];
  13.                         if(row===0&&col ===0){  //设置不能删除的单元格

  14.                         }else{
  15.                             var commandManager = context.commandManager();
  16.                             commandManager.execute({cmd: "gc.spread.contextMenu.clearContents", sheetName: spread.getActiveSheet().name()});
  17.                         }

  18.                                                 console.log("此处写入后处理逻辑");
  19.                                                 Commands.endTransaction(context, options);
  20.                                                 return true
  21.                                         }
  22.                                 }
  23.                         };
  24.                         commandManager.register("CustomClearContents", command);

  25.                         spread.contextMenu.menuData.forEach(function(item,index,self){
  26.                                 if (item.name === 'gc.spread.clearContents') {
  27.                                         item.command  = "CustomClearContents";
  28.                                 }
  29.                         })
复制代码

以上代码对“清除内容”菜单进行了重写,当判断当前单元格为A1单元格时,不做清除内容操作。
三、禁用右键菜单
除此还可以根据选中的单元格进行禁用
  1.      function ContextMenu() {
  2.         }

  3.         ContextMenu.prototype = new GC.Spread.Sheets.ContextMenu.ContextMenu(spread);
  4.         ContextMenu.prototype.onOpenMenu = function (menuData, itemsDataForShown, hitInfo, spread) {
  5.             let sheet = spread.getActiveSheet();
  6.             let selections = sheet.getSelections();

  7.             for (let i = 0; i < itemsDataForShown.length; i++) {
  8.                 var item = itemsDataForShown[i];
  9.                 if (item.name === "gc.spread.clearContents" && (selections[0].col == 0)) {
  10.                     item.disable = true;
  11.                 }
  12.             }
  13.         };

  14.         spread.contextMenu = new ContextMenu();
复制代码
上述代码实现了第一列“清除”菜单的禁用,如下图所示:
image.png308830870.png
好了,通过上述种种方案,终于可以实现不能删除单元格内容的需求了。
四、默认值
但是,有没有更简单的方案呢?
答案是有的:在V16版本,SpreadJS推出了一个默认值的概念,可以从这里体验一下:
https://demo.grapecity.com.cn/sp ... efault-value/purejs
其主要用法是
  1.   sheet.setDefaultValue(0,0,1);
复制代码
上述这行代码表示:为A1单元格创建了一个默认值,默认值是1,用户可以编辑修改,但是不能删除,或者说删除不了。
如下动图所示:
五、表单保护
有细心的小伙伴们发现了,通过上述的方案可以实现单元格的内容不被删除,但是可以通过删除行/列使其当前单元格直接被删除。
image.png737514648.png
点击确定后,原来表单中的第一行被删除,自然A1单元格的内容也没了,对此,可以通过表单保护来实现单元格不被编辑:
具体可以参考这篇文章:
https://demo.grapecity.com.cn/sp ... tion/disableEditing



默认值.gif

0 个回复

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