找回密码
 立即注册

QQ登录

只需一步,快速开始

zhangjintao

注册会员

18

主题

45

帖子

147

积分

注册会员

积分
147

[已处理] 右键菜单

zhangjintao
注册会员   /  发表于:2018-11-26 16:40  /   查看:8486  /  回复:11
需求:对表格锁定以后,只有部分列可以修改,比如C列,当我们在通过右键菜单新增行时,新增行的C列单元格也默认被锁定了。
请问有没有扩展右键菜单的方法,比如当在右键插入行时,处理一下某个单元格的锁定状态,请指点,谢谢

11 个回复

倒序浏览
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-11-26 18:22:43
沙发
您好,您可以通过自定义右键菜单命令的方式,来添加自己的代码逻辑,

具体方法我给您上传一个Demo,Demo展示了两点:

1、代码设置列非锁定状态,如果您按这种方式设置的列,不会出现您描述的问题。

2、自定义右键菜单命令。

根据您对问题的描述,强烈建议您使用第一种方法,为C列设置一个style即可,

这样无论您在任何一行执行插入行操作,新插入的C列单元格都不会出现被锁定的状态。

CustomContextMenu_zhangjintao.html

3.42 KB, 下载次数: 427

回复 使用道具 举报
kkij
金牌服务用户   /  发表于:2018-12-25 16:01:40
板凳
KevinChen 发表于 2018-11-26 18:22
您好,您可以通过自定义右键菜单命令的方式,来添加自己的代码逻辑,

具体方法我给您上传一个Demo,Demo ...

我要实现右键菜单一些功能 保留,有固定的几列不能编辑,但是这样谢了就所有的都不能编辑了

var protectedOptions = {
            allowSelectLockedCells:true,
            allowSelectUnlockedCells:true,
            allowFilter: false,
            allowSort: false,
            allowResizeRows: true,
            allowResizeColumns: true,
            allowEditObjects: false,
            allowDragInsertRows: false,
            allowDragInsertColumns: false,
            allowInsertRows: false,
            allowInsertColumns: false,
            allowDeleteRows: true,
            allowDeleteColumns: false
        };
        sheet.options.protectionOptions = protectedOptions;
        sheet.options.isProtected = true;

        var style = sheet.getDefaultStyle();
        style.locked = false;

    //设置分册名和产品型号两列不可编辑
   
    var colcount = sheet.getColumnCount();
    for (var j = 0; j < colcount; j++)
    {
        var colname = sheet.getValue(0, j, GC.Spread.Sheets.SheetArea.colHeader);
        if ((colname == "分册名") || (colname == "产品型号") ||(colname == "产品类型")){
            sheet.setStyle(-1, j, style);            
            sheet.getCell(-1, j).locked(true);   
            
         }
    }
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-12-25 16:51:49
地板
kkij 发表于 2018-12-25 16:01
我要实现右键菜单一些功能 保留,有固定的几列不能编辑,但是这样谢了就所有的都不能编辑了

var prot ...

您注意这行代码:

  1. sheet.getCell(-1, j).locked(true);
复制代码


当您给getCell() 中传入-1时,就表示您获取到一整行或一整列,

您可以先将整张表解锁,示例代码:

  1. var style = sheet.getDefaultStyle();
  2. style.locked = false;
  3. sheet.setDefaultStyle(style);
复制代码


然后将您指定的列进行锁定操作即可。
回复 使用道具 举报
kkij
金牌服务用户   /  发表于:2019-1-4 09:06:05
5#
KevinChen 发表于 2018-12-25 16:51
您注意这行代码:

sheet.getCell(j,-1).locked(true); 我用了这个锁定某行不能编辑,为什么不生效呢?
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-1-4 09:49:14
6#
kkij 发表于 2019-1-4 09:06
sheet.getCell(j,-1).locked(true); 我用了这个锁定某行不能编辑,为什么不生效呢?

您好,您这行代码的作用是,遍历行,并且给这个行添加locked样式属性。

在SpreadJS中,行的样式优先级是低于单元格样式优先级的,

您可以检查一下,您的单元格上是否设置了locked属性并赋值为false,

您可以用sheet.getStyle(row, col)来获取指定单元格的样式。

如果单元格设置了style并且locked属性不等于undefined,

那么您在行上设置的locked属性就不会在这个单元格上生效,

更直观的Demo可以看学习指南:

https://demo.grapecity.com.cn/Sp ... ample/#/demos/style
回复 使用道具 举报
kkij
金牌服务用户   /  发表于:2019-1-4 10:38:52
7#
KevinChen 发表于 2019-1-4 09:49
您好,您这行代码的作用是,遍历行,并且给这个行添加locked样式属性。

在SpreadJS中,行的样式优先级 ...

没有设置单元格lock属性,全部代码如下:
var count = sheet.getColumnCount();
var rowcount = sheet.getRowCount();

for (var i = 0; i < count; i++) {     
       sheet.autoFitColumn(i);
       var colwidth = sheet.getColumnWidth(i);
       if (colwidth < 100)
           sheet.setColumnWidth(i, 100);

       var colname = sheet.getValue(0, i, GC.Spread.Sheets.SheetArea.colHeader);
       if (colname == "是否作废") {
           //作废行灰色
           for (var j = 0; j < rowcount; j++) {

               var zf = sheet.getValue(j, i, GC.Spread.Sheets.SheetArea.viewport);
               if (trimRight(trimLeft(zf))=="作废")
               {
                   sheet.getCell(j, -1).locked(true);   
                   sheet.getRange(j, 0, 1, sheet.getColumnCount()).backColor("lightgray");                  
                  
               }
           }
           sheet.setColumnVisible(i, false);
      
       }
   }
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-1-4 12:11:31
8#
您好,看了您的代码,没有什么问题,我这边也按照您的逻辑测试了这几行代码,

成功地锁定了指定的行。

您是否可以提供一个能重现问题的ssjson文档,

我需要分析一下您的ssjson文档。
回复 使用道具 举报
kkij
金牌服务用户   /  发表于:2019-1-8 09:18:57
9#
KevinChen 发表于 2019-1-4 12:11
您好,看了您的代码,没有什么问题,我这边也按照您的逻辑测试了这几行代码,

成功地锁定了指定的行。

这个行锁定问题还没有解决,我怎么做成ssjson文档传给您?因为数据是连着本地数据库的
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-1-8 10:51:00
10#
kkij 发表于 2019-1-8 09:18
这个行锁定问题还没有解决,我怎么做成ssjson文档传给您?因为数据是连着本地数据库的

您只需利用toJSON()导出一个json串,保存到一个文本文件里,

带不带数据都无所谓,我主要是想看一下您单元格的样式设置。

我这边将您提供的这个json导入到Spread中,重现一下问题,分析一下JSON串,排查一下问题。

如果您不清楚怎么实现导出当前页面的模板,我提供一段代码您参考一下:

  1. var funDownload = function (content, filename) {
  2.     var eleLink = document.createElement('a');
  3.     eleLink.download = filename;
  4.     eleLink.style.display = 'none';
  5.     // 字符内容转变成blob地址
  6.     var blob = new Blob([content]);
  7.     eleLink.href = URL.createObjectURL(blob);
  8.     // 触发点击
  9.     document.body.appendChild(eleLink);
  10.     eleLink.click();
  11.     // 然后移除
  12.     document.body.removeChild(eleLink);
  13. };
  14. var spread = GC.Spread.Sheets.findControl("ss");
  15. var testJson = JSON.stringify(spread.toJSON({includeBindingSource:true}));
  16. funDownload(testJson, "test.ssjson");
复制代码

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