找回密码
 立即注册

QQ登录

只需一步,快速开始

Barry
中级会员   /  发表于:2023-1-16 09:31  /   查看:2647  /  回复:11
30金币
我通过禁用单元格的EditStarting事件,来让单元格不允许编辑,但粘贴,填充等操作任然能触发单元格的修改,并且这个修改editstarting监听不到,这个怎么去解决呢?

最佳答案

查看完整内容

如果只是不让单元格编辑的话,可以试下表单保护方案: 1、 设置全部单元格locked为false 2、设置指定单元格locked为true 3、设置表单保护 对此,可以实现A1单元格不可编辑。

11 个回复

倒序浏览
最佳答案
最佳答案
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-1-16 09:31:04
来自 2#
如果只是不让单元格编辑的话,可以试下表单保护方案:

1、 设置全部单元格locked为false

  1. var defaultStyle = new GC.Spread.Sheets.Style();
  2.                 defaultStyle.locked = false;
  3.                 sheet.setDefaultStyle(defaultStyle, GC.Spread.Sheets.SheetArea.viewport);
复制代码
2、设置指定单元格locked为true
  1.        var style = new GC.Spread.Sheets.Style();
  2.                 style.locked = true;
  3.                 style.backColor = "yellow";
  4.                 sheet.setStyle(0, 0, style);
复制代码
3、设置表单保护               
  1. sheet.options.isProtected = true;
复制代码
对此,可以实现A1单元格不可编辑。
回复 使用道具 举报
Barry
中级会员   /  发表于:2023-1-16 10:02:57
3#
表单保护的话,锁定的单元格,在修改数据源的时候,会被修改吗?
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-1-16 11:10:13
4#
如下图所示:

image.png59578551.png
一开始设置的数据源是 { name: 'Alice', age: 27, birthday: '1985/08/31', position: 'PM' }
之后重新setDataSource(),发现getDataSouce()时 A1单元格发生了变化。

所以您说的修改数据源,如果是UI 上修改数据,因为A1单元格被锁定,所以不能修改;如果通过setDataSouce()用代码方式修改数据源,是可以修改的。
您这边的需求是什么呢?
回复 使用道具 举报
Barry
中级会员   /  发表于:2023-1-16 11:21:16
5#
Ellia.Duan 发表于 2023-1-16 11:10
如下图所示:



我这边的的需求就是让锁定的单元格绝对无法编辑,setDataSource我们用在了数据导入上,这个我可以改下导入的数据,但从页面上的角度,我开始表单保护之后,锁定的单元格就能实现任何方式都不能编辑了是吗?比如粘贴,下拉填充这些,然后defaultStyle的范围包括些什么呢,就是如果我单元格设置成按钮,下拉选框这样的,这个也能锁定吗
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-1-16 11:31:11
6#
第一个问题:通过上面表单保护的方案,不能编辑,不能复制粘贴。
第二个问题:首先设置表单保护后,受保护的单元格即使是按钮,下拉框,用户也不能操作点击。这个您可以在上述代码基础上进行测试。
回复 使用道具 举报
Barry
中级会员   /  发表于:2023-1-16 12:04:58
7#
本帖最后由 Barry 于 2023-1-16 12:14 编辑
Ellia.Duan 发表于 2023-1-16 11:31
第一个问题:通过上面表单保护的方案,不能编辑,不能复制粘贴。
第二个问题:首先设置表单保护后,受保护 ...

你好,我试了一下之后发现,表单保护开启之后,整个表单的很多操作都被禁用了,如果我只是想禁用单元格让页面上对这个单元格的数据输入等不生效的话,其他的任何操作还是和未开启表单保护一样,这种怎么弄呢
image.png520045775.png
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-1-16 13:46:05
8#
方案一:
https://demo.grapecity.com.cn/sp ... t/protection/purejs
参考如上学习指南:对表单保护选项进行设置,
image.png926100463.png
方案二:
在您问题基础上,在EditStarting事件中,取消用户编辑。您提到了不想允许粘贴,可以在ClipboardPasting事件中判断是目标单元格后,取消操作
  1. sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, function (sender, args) {
  2.             const {pasteData, cellRange, sheet} = args
  3.             if(cellRange.row==1 && cellRange.col==0){
  4.                 args.cancel = true;
  5.             }

  6.         });
复制代码


回复 使用道具 举报
Barry
中级会员   /  发表于:2023-1-16 14:06:12
9#
Ellia.Duan 发表于 2023-1-16 13:46
方案一:
https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/features/worksheet/protection/pure ...

方案二中,下拉填充依然会对锁定的单元格进行编辑,有没有什么办法能在下拉填充的过程中跳过其中包含的被我判断为锁定的单元格呢
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-1-16 14:36:24
10#
Barry 发表于 2023-1-16 14:06
方案二中,下拉填充依然会对锁定的单元格进行编辑,有没有什么办法能在下拉填充的过程中跳过其中包含的被 ...

您可以在DragFillBlock事件中监听,填充区域是否包括不可编辑区域,用getIntersect这个API获取交集
如果有交集,则取消操作。
  1. sheet.bind(GC.Spread.Sheets.Events.DragFillBlock, function (e, info) {
  2.             const {fillRange} = info
  3.             let range1  = new GC.Spread.Sheets.Range(1,0,1,1);
  4.             if(fillRange.getIntersect(range1)){
  5.                 info.cancel = true;
  6.             }
  7.         });
复制代码
但是上述方案就是整个操作取消,无法对某一个单元格取消内容。


回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部