找回密码
 立即注册

QQ登录

只需一步,快速开始

云智装
金牌服务用户   /  发表于:2021-11-17 16:27  /   查看:3560  /  回复:10
1金币
image.png598567809.png
需求:鼠标右键之前设置弹框的逻辑,然后再弹框。原因:

通过监听SelectionChanging事件,在事件里写自己的控制逻辑,然后重新设置[size=15.0667px]contextMenu,但是在鼠标右键弹出的时候,不是当前设置的contextMenu,而是上一次设置的,导致当前弹出的[size=15.0667px]contextMenu控制不对

最佳答案

查看完整内容

那就在onopenmenu方法中获取一下当前的a和b到底是什么,然后判断就行了

10 个回复

倒序浏览
最佳答案
最佳答案
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-11-17 16:27:37
来自 6#
那就在onopenmenu方法中获取一下当前的a和b到底是什么,然后判断就行了
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-11-17 16:37:55
2#
如果想要控制右键菜单的弹出逻辑,您不能够通过监听SelectionChanging事件来控制。而是需要重写ContextMenu的onOpenMenu方法,该方法在每次右键弹出菜单的时候触发,在里面可以改写弹出菜单的内容。相关参考文档示例如下:
https://demo.grapecity.com.cn/sp ... enu.html#onOpenMenu
回复 使用道具 举报
云智装
金牌服务用户   /  发表于:2021-11-17 16:57:28
3#
Clark.Pan 发表于 2021-11-17 16:37
如果想要控制右键菜单的弹出逻辑,您不能够通过监听SelectionChanging事件来控制。而是需要重写ContextMenu ...

现在我是用onOpenMenu控制的,但是会存在以上的问题,例如:要A列可以插入,1行不可以插入,我只能在用户右键的时候去设置对应参数,在弹框,在弹框里面要控制哪一列就是我设置好的,但是弹框的内容是上次设置的不是这一次设置的,也就是说,怎么弄才能实现设置逻辑和弹框是同步的
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-11-17 17:02:21
4#
我没明白您说的要A列可以插入,1行不可以插入具体什么意思,用户点击位置是1列还是说是1行吗?建议您把您现在所做的成果制作成一个demo,附件上传上来,以便于我们快速的get到您想要表达的意思。
回复 使用道具 举报
云智装
金牌服务用户   /  发表于:2021-11-17 17:16:00
5#
Clark.Pan 发表于 2021-11-17 17:02
我没明白您说的要A列可以插入,1行不可以插入具体什么意思,用户点击位置是1列还是说是1行吗?建议您把您现 ...

意思是右键菜单的显示,是通过动态传参数去控制的。
下面是我的
控制逻辑
//如果满足禁用条件,设置菜单禁用
if(a<b){
spread.contextMenu = onOpenMenu(false, false, false, false, false, false, false);
}else{ //否则都可以操作
  spread.contextMenu = onOpenMenu();
}
  
/**
   * 控制右键菜单总的方法
   * @param copy 复制
   * @param cut 粘贴
   * @param allowInsertRows 是否能插入行
   * @param allowDeleteRows 是否能删除行
   * @param allowInsertColumns 是否能插入列
   * @param allowDeleteColumns 是否能删除列
   * @param clearContents 清除
   */
  function onOpenMenu(copy = true, cut = true, allowInsertRows = true, allowDeleteRows = true, allowInsertColumns = true, allowDeleteColumns = true, clearContents = true) {
    function MyContextMenu() {}
    MyContextMenu.prototype = new GC.Spread.Sheets.ContextMenu.ContextMenu(spread);
    MyContextMenu.prototype.onOpenMenu = (menuData, itemsDataForShown, hitInfo, spread) => {
      console.log('是否可复制',copy);
      console.log(itemsDataForShown);
      itemsDataForShown.forEach((item, index) => {
        switch (item && item.name) {
          case 'gc.spread.copy':
            item.disable = !copy;
            break;
          case 'gc.spread.cut':
            item.disable = !cut;
            break;
          case 'gc.spread.insertRows':
            item.disable = !allowInsertRows;
            break;
          case 'gc.spread.deleteRows':
            item.disable = !allowDeleteRows;
            break;
          case 'gc.spread.clearContents':
            item.disable = !clearContents;
            break;
          case 'gc.spread.insertColumns':
            item.disable = !allowInsertColumns;
            break;
          case 'gc.spread.deleteColumns':
            item.disable = !allowDeleteColumns;
            break;
        }
      });
    };
    let contextMenu = new MyContextMenu();
    return contextMenu
  }
回复 使用道具 举报
云智装
金牌服务用户   /  发表于:2021-11-17 17:27:03
7#
Clark.Pan 发表于 2021-11-17 17:02
我没明白您说的要A列可以插入,1行不可以插入具体什么意思,用户点击位置是1列还是说是1行吗?建议您把您现 ...

image.png127103270.png
如上图,在表格对应的行和列中,用户不可以进行插入行或者列操作,例如:在B列到I列、或者2行到14行,右键时控制不可以插入列
回复 使用道具 举报
云智装
金牌服务用户   /  发表于:2021-11-17 17:28:04
8#
Clark.Pan 发表于 2021-11-17 17:17
那就在onopenmenu方法中获取一下当前的a和b到底是什么,然后判断就行了

我试试
回复 使用道具 举报
云智装
金牌服务用户   /  发表于:2021-11-17 17:41:59
9#
Clark.Pan 发表于 2021-11-17 17:17
那就在onopenmenu方法中获取一下当前的a和b到底是什么,然后判断就行了

多谢大佬指点,可以了
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-11-17 17:43:24
10#
云智装 发表于 2021-11-17 17:27
如上图,在表格对应的行和列中,用户不可以进行插入行或者列操作,例如:在B列到I列、或者2行到14行, ...

我明白了,那就在onopenmenu中通过getSelections方法获取一下当前用户选中的内容,然后进行判断即可。比如获取到了用户选中的是第一行整行,那么可以插入,选中第二列则不行
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部