找回密码
 立即注册

QQ登录

只需一步,快速开始

anyOneCode

注册会员

3

主题

26

帖子

71

积分

注册会员

积分
71
最新发帖
anyOneCode
注册会员   /  发表于:2023-9-15 09:54  /   查看:3371  /  回复:17
2金币
本帖最后由 Ellia.Duan 于 2023-9-15 14:01 编辑

现在有个问题,我每次点击右键菜单,第一次总是显示全部菜单,第二次才出现筛选后的菜单

  1. // 右键列头禁止右键菜单
  2.       let elements = sheetList[sheetIndex].elements;
  3.       let oldOpenMenu = spread.contextMenu.onOpenMenu;
  4.       const menuDataList = spread.contextMenu.menuData;
  5.       // if (elements[0].isAllowEdit === 1) {
  6.       //     // console.log(item);
  7.       //     spread.contextMenu.menuData = menuDataList.filter((item: any) => {
  8.       //       return (
  9.       //         item.text !== "插入批注" &&
  10.       //         item.text !== "设置单元格格式..." &&
  11.       //         item.text !== "超链接..." &&
  12.       //         item.text !== "编辑富文本..." &&
  13.       //         item.text !== "定义名称..." &&
  14.       //         item.text !== "标签..."
  15.       //       );
  16.       //     });
  17.       // } else {
  18.       //   spread.contextMenu.menuData = menuDataList.filter((item: any) => {
  19.       //     return (
  20.       //       item.text !== "删除..." &&
  21.       //       item.text !== "删除" &&
  22.       //       item.text !== "清除内容" &&
  23.       //       item.text !== "插入批注" &&
  24.       //       item.text !== "设置单元格格式..." &&
  25.       //       item.text !== "超链接..." &&
  26.       //       item.text !== "编辑富文本..." &&
  27.       //       item.text !== "定义名称..." &&
  28.       //       item.text !== "标签..."
  29.       //     );
  30.       //   });
  31.       // }
  32.       spread.contextMenu.onOpenMenu = function (
  33.         menuData,
  34.         itemsDataForShown,
  35.         hitInfo,
  36.         spread
  37.       ) {
  38.         console.log(menuData);
  39.         const selections = spread.getSheetFromName(element.sheetName).getSelections();


  40.         if (selections[0].row !== -1) {
  41.           oldOpenMenu.apply(this, [
  42.             menuData,
  43.             itemsDataForShown,
  44.             hitInfo,
  45.             spread,
  46.           ]);
  47.         }
  48.         // 根据isAllowEdit判断菜单禁用问题
  49.         console.log(selections[0].col,elements[selections[0].col]);
  50.         // elements.forEach((item: any) => {
  51.         if (elements[selections[0].col].isAllowEdit === 1) {
  52.           // console.log(item);
  53.           spread.contextMenu.menuData = menuDataList.filter((item: any) => {
  54.             return (
  55.               item.text !== "插入批注" &&
  56.               item.text !== "设置单元格格式..." &&
  57.               item.text !== "超链接..." &&
  58.               item.text !== "编辑富文本..." &&
  59.               item.text !== "定义名称..." &&
  60.               item.text !== "标签..."
  61.             );
  62.           });
  63.         } else {
  64.           spread.contextMenu.menuData = menuDataList.filter((item: any) => {
  65.             return (
  66.               item.text !== "删除..." &&
  67.               item.text !== "删除" &&
  68.               item.text !== "清除内容" &&
  69.               item.text !== "插入批注" &&
  70.               item.text !== "设置单元格格式..." &&
  71.               item.text !== "超链接..." &&
  72.               item.text !== "编辑富文本..." &&
  73.               item.text !== "定义名称..." &&
  74.               item.text !== "标签..."
  75.             );
  76.           });
  77.         }

  78.         // });
  79.         console.log(elements);
  80.       };
复制代码



1694588977599.png406054381.png
1694588977599.png91241148.png

最佳答案

查看完整内容

这是因为Designer和Spread的右键菜单实现方法是不一样的,具体请您参阅这篇文章:https://gcdn.grapecity.com.cn/showtopic-169149-1-1.html

17 个回复

倒序浏览
最佳答案
最佳答案
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-9-15 09:54:58
来自 18#
这是因为Designer和Spread的右键菜单实现方法是不一样的,具体请您参阅这篇文章:https://gcdn.grapecity.com.cn/showtopic-169149-1-1.html
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-9-15 14:10:07
2#
您好,通过您的标题描述,正文描述,以及您的代码,不清楚您想要实现的需求。
请再详细描述下您的需求,是点击列头不出现右键菜单吗?或者您截图看下您想要的效果,这边来调研如何实现。
回复 使用道具 举报
anyOneCode
注册会员   /  发表于:2023-9-15 14:30:22
3#
Ellia.Duan 发表于 2023-9-15 14:10
您好,通过您的标题描述,正文描述,以及您的代码,不清楚您想要实现的需求。
请再详细描述下您的需求,是 ...

spread.contextMenu.onOpenMenu = function (
        menuData,
        itemsDataForShown,
        hitInfo,
        spread
      ) {
        console.log(itemsDataForShown);
        let itemMenu = itemsDataForShown
        const selections = spread.getSheetFromName(element.sheetName).getSelections();


        if (selections[0].row !== -1) {
          oldOpenMenu.apply(this, [
            menuData,
            itemsDataForShown,
            hitInfo,
            spread,
          ]);
        }
        // 根据isAllowEdit判断菜单禁用问题
        // console.log(selections[0].col,elements[selections[0].col]);
        // if (elements[selections[0].col].isAllowEdit === 1) {
        //   // console.log(item);
        //   spread.contextMenu.menuData  = itemsDataForShown.filter((item: any) => {
        //     return (
        //       item.text !== "插入批注" &&
        //       item.text !== "设置单元格格式..." &&
        //       item.text !== "超链接..." &&
        //       item.text !== "编辑富文本..." &&
        //       item.text !== "定义名称..." &&
        //       item.text !== "标签..."
        //     );
        //   });
        // } else {
        //   spread.contextMenu.menuData = itemsDataForShown.filter((item: any) => {
        //     return (
        //       item.text !== "删除..." &&
        //       item.text !== "删除" &&
        //       item.text !== "清除内容" &&
        //       item.text !== "插入批注" &&
        //       item.text !== "设置单元格格式..." &&
        //       item.text !== "超链接..." &&
        //       item.text !== "编辑富文本..." &&
        //       item.text !== "定义名称..." &&
        //       item.text !== "标签..."
        //     );
        //   });
        // }
        const Alltrue = ["gc.spread.contextMenu.insertComment","formatCells","link","richText" , "defineName" ,"cellTag"]
        const Allfalse = ["gc.spread.contextMenu.clearContents","tableDelete","gc.spread.contextMenu.insertComment","formatCells","link","richText" , "defineName" ,"cellTag"]
        // const Alltrue = ["插入批注","设置单元格格式...","超链接...","编辑富文本..." , "定义名称..." ,"标签..."]
        // const Allfalse = ["清除内容","删除","插入批注","设置单元格格式...","超链接...","编辑富文本...","定义名称..." ,"标签..."]
        for(let i=0; i<itemsDataForShown.length; i++){
          var item = itemsDataForShown;
          if(elements[selections[0].col].isAllowEdit === 1 && Alltrue.includes(item.name)){
            item.disable = true;
            if(item.subMenu){
              item.subMenu.forEach(citem => {
                citem.disable = true;
              })
            }
          }
          if(elements[selections[0].col].isAllowEdit === 0 && Allfalse.includes(item.name)){
            item.disable = true;
            if(item.subMenu){
              item.subMenu.forEach(citem => {
                citem.disable = true;
              })
            }
          }
        }
        spread.contextMenu.menuData = itemsDataForShown

        console.log(elements);
      };
你好,我这里想根据条件禁用右键部分菜单,但目前我发现删除没在上面Alltrue 数组中,但被置灰了,但可以选他子菜单,但是再Allfalse中,可以正常禁用
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-9-15 16:58:27
4#
anyOneCode 发表于 2023-9-15 14:30
spread.contextMenu.onOpenMenu = function (
        menuData,
        itemsDataForShown,

您好,可以参考下面的代码进行行删除菜单的disabled 设置

  1. var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {sheetCount: 2});


  2.         function ContextMenu() {
  3.         }

  4.         ContextMenu.prototype = new GC.Spread.Sheets.ContextMenu.ContextMenu(spread);
  5.         ContextMenu.prototype.onOpenMenu = function (menuData, itemsDataForShown, hitInfo, spread) {
  6.             for (let i = 0; i < itemsDataForShown.length; i++) {
  7.                 var item = itemsDataForShown[i];
  8.                 console.log(item)
  9.                 if (item.name === "gc.spread.deleteRows") {
  10.                     item.disable = true;
  11.                 }
  12.             }
  13.         };
  14.         //   将自定义右键菜单赋值给spread.contextMenu
  15.         spread.contextMenu = new ContextMenu();
复制代码
在浏览器打开此文件,发现行头的删除行选项已经被置灰
image.png508111876.png
您可以在此demo基础上完善您的相关代码。

disabled1.html

1.64 KB, 下载次数: 260

回复 使用道具 举报
anyOneCode
注册会员   /  发表于:2023-9-18 10:29:45
5#
Ellia.Duan 发表于 2023-9-15 16:58
您好,可以参考下面的代码进行行删除菜单的disabled 设置

在浏览器打开此文件,发现行头的删除行选项 ...

你好,按照你的说实现了,但有个问题 微信截图_20230918102828.png159762877.png 右键有些菜单没有事什么情况
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-9-18 10:47:37
6#
anyOneCode 发表于 2023-9-18 10:29
你好,按照你的说实现了,但有个问题右键有些菜单没有事什么情况

您是指子级菜单点击没有反应吗?
回复 使用道具 举报
anyOneCode
注册会员   /  发表于:2023-9-18 10:58:23
7#
Ellia.Duan 发表于 2023-9-18 10:47
您是指子级菜单点击没有反应吗?

不是,是子菜单少了几个,有什么规则吗
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-9-18 11:13:00
8#
anyOneCode 发表于 2023-9-18 10:58
不是,是子菜单少了几个,有什么规则吗

您上传下您的可以运行可以复现问题的代码,帮您看一下。
回复 使用道具 举报
anyOneCode
注册会员   /  发表于:2023-9-18 11:13:51
9#
Ellia.Duan 发表于 2023-9-18 11:13
您上传下您的可以运行可以复现问题的代码,帮您看一下。

let elements = sheetList[sheetIndex].elements;
      let oldOpenMenu = spread.contextMenu.onOpenMenu;

      spread.contextMenu.onOpenMenu = function (
        menuData,
        itemsDataForShown,
        hitInfo,
        spread
      ) {
        console.log(itemsDataForShown);
        const selections = spread.getSheetFromName(element.sheetName).getSelections();


        if (selections[0].row !== -1) {
          oldOpenMenu.apply(this, [
            menuData,
            itemsDataForShown,
            hitInfo,
            spread,
          ]);
        }

        const Alltrue = ["gc.spread.insertComment","formatCells","tableDelete","link","richText" , "defineName" ,"cellTag"]
        const Allfalse = ["gc.spread.contextMenu.clearContents","tableDelete","gc.spread.insertComment","formatCells","link","richText" , "defineName" ,"cellTag"]
        // const Alltrue = ["插入批注","设置单元格格式...","超链接...","编辑富文本...","定义名称..." ,"标签..."]
        // const Allfalse = ["清除内容","删除","插入批注","设置单元格格式...","超链接...","编辑富文本...","定义名称..." ,"标签..."]
        for(let i=0; i<itemsDataForShown.length; i++){
          var item = itemsDataForShown;
          if(elements[selections[0].col].isAllowEdit === 1 && Alltrue.includes(item.name)){
            item.disable = true;
            if(item.subMenu){
              item.subMenu.forEach(citem => {
                citem.disable = true;
                console.log(citem.name);
                if(citem.name == "tableDeleteRowsForContextMenu"){
                  citem.disable = false;
                }
              })
            }
          }

          if(elements[selections[0].col].isAllowEdit === 0 && Allfalse.includes(item.name)){
            item.disable = true;
            if(item.subMenu){
              item.subMenu.forEach(citem => {
                citem.disable = true;
              })
            }
          }
        }
        spread.contextMenu.menuData = itemsDataForShown

        console.log(elements);
      };
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部