找回密码
 立即注册

QQ登录

只需一步,快速开始

Derrick.Jiao 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-8-2 14:18  /   查看:3668  /  回复:11
本帖最后由 Lynn.Dou 于 2023-8-3 15:04 编辑

相信大家在使用腾讯文档、石墨文档等其他文档表格的时候,都会发现可以右键插入多行。使用SpreadJS的小伙伴也想实现这个功能,应该如何实现呢?那么本次教程将会带来右键插入多行的实践教程。(注意:本次教程使用的一个属性是14.1.3后新增的,因此该方法适用于14.1.3以后的版本,没升级的小伙伴请及时升级)。

要想右键插入多行,我们首先需要定义一个右键菜单的对象,并将其push到右键菜单数组中。
  1. var insertRows = {
  2.             text: "在上方插入",
  3.             name: "insertRows",
  4.             command: "rowsCount",
  5.             workArea: "rowHeader"
  6.       
  7.         };
  8.         spread.contextMenu.menuData.push(insertRows);
复制代码

接着,我们需要注册上面名为rowsCount的命令,并将addRows方法在execute中调用。var commandManager = spread.commandManager();
var insertRowsByCounts = {
            canUndo: false,
            execute: function (spread, options) {
                if(options.commandOptions){   
                    console.log('在上方插入'+options.commandOptions);
                    var sheet = spread.getSheetFromName(options.sheetName)
                    sheet.suspendPaint()
                    sheet.addRows(options.activeRow,parseInt(options.commandOptions))
                    sheet.resumePaint()

                }
            }
        };
        commandManager.register("rowsCount", insertRowsByCounts, null, false, false, false, false);

下面就是重写createMenuItemElement、getCommandOptions,并且在这里面创建我们的input框和文本。

  1. function CustomMenuView() {
  2.         }
  3.         CustomMenuView.prototype = new GC.Spread.Sheets.ContextMenu.MenuView();
  4.         CustomMenuView.prototype.createMenuItemElement = function (menuItemData) {
  5.             var self = this;
  6.             if (menuItemData.name === "insertRows") {
  7.                 var containers = GC.Spread.Sheets.ContextMenu.MenuView.prototype.createMenuItemElement.call(self, menuItemData);
  8.                 var supMenuItemContainer = containers[0];

  9.                 var inputBlock = createInput();
  10.                 var btnupBlock = createBtn();

  11.                 supMenuItemContainer.appendChild(inputBlock);
  12.                 supMenuItemContainer.appendChild(btnupBlock);

  13.                 return supMenuItemContainer;
  14.             } else {
  15.                 var menuItemView = GC.Spread.Sheets.ContextMenu.MenuView.prototype.createMenuItemElement.call(self, menuItemData);
  16.                 return menuItemView;
  17.             }
  18.         }
  19.         CustomMenuView.prototype.getCommandOptions = function (menuItemData, host, event) {
  20.             if (menuItemData && menuItemData.name === "insertRows") {
  21.                 var ele = document.getElementsByClassName("inputBlock")[0]
  22.                 return ele.value;
  23.             }
  24.         };
  25.         spread.contextMenu.menuView = new CustomMenuView();
复制代码

最后用js代码来创建两个dom元素,分别为input和p标签,需要注意的是,我们需要用stopPropagation给input框阻止事件冒泡,这样我们的input框点击进入之后才不会关闭右键菜单。同时,我们还需要给input框加上我们内部的属性就大功告成。
  1. setAttribute('gcUIElement', 'gcContextMenu');
复制代码
实现效果如下
image.png945104064.png

下载附件即可查看完整demo.

在designer中实现上述右键菜单效果思路类似,具体demo可以点击下方链接。
https://jscodemine.grapecity.com ... sExplorerShow=false



image.png509743346.png

右键菜单(插入输入行).html

6.54 KB, 下载次数: 49

11 个回复

倒序浏览
逮高乐
注册会员   /  发表于:2022-8-2 09:45:02
沙发
设计器表格多行插入怎么操作呢?
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2022-8-2 09:55:38
板凳
逮高乐 发表于 2022-8-2 09:45
设计器表格多行插入怎么操作呢?

可以参考这个demo
https://jscodemine.grapecity.com ... sExplorerShow=false
回复 使用道具 举报
逮高乐
注册会员   /  发表于:2022-8-2 10:14:12
地板
Derrick.Jiao 发表于 2022-8-2 09:55
可以参考这个demo
https://jscodemine.grapecity.com/share/hzXr0BYRvkypPiC3zYDRcA/?isEmbed=true&isEx ...

好了,感谢
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-8-2 10:40:54
5#
回复 使用道具 举报
sssssss
金牌服务用户   /  发表于:2022-8-2 15:25:40
6#
v15.0 使用了demo的代码没有展示出菜单项,经查是因为使用了这种方式定义的spread请问要如何修改呢?
  1. this.designer = new GC.Spread.Sheets.Designer.Designer(document.getElementById("hostDiv"));
  2.       this.spread = this.designer.getWorkbook();
复制代码
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2022-8-2 17:58:27
7#
本帖最后由 Derrick.Jiao 于 2022-8-18 09:24 编辑
sssssss 发表于 2022-8-2 15:25
v15.0 使用了demo的代码没有展示出菜单项,经查是因为使用了这种方式定义的spread请问要如何修改呢?

需要在设计器上实现,请参考上面二楼回复的链接
https://jscodemine.grapecity.com ... sExplorerShow=false

image.png339164122.png
回复 使用道具 举报
sssssss
金牌服务用户   /  发表于:2022-8-17 19:56:21
8#
想给右键弹窗中的输入框绑定 回车添加行的事件,如何在添加行之后关闭右键菜单呢?
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2022-8-18 13:38:30
9#
sssssss 发表于 2022-8-17 19:56
想给右键弹窗中的输入框绑定 回车添加行的事件,如何在添加行之后关闭右键菜单呢?

目前受inputBlock.setAttribute('gcUIElement', 'gcContextMenu');限制,可能无法实现该需求,这边需要调研一下看下是否支持
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2022-8-25 10:10:15
10#
sssssss 发表于 2022-8-17 19:56
想给右键弹窗中的输入框绑定 回车添加行的事件,如何在添加行之后关闭右键菜单呢?

请参考最新的demo,可以通过回车来结束编辑并关闭右键菜单。

右键菜单(插入输入行_update.html

4.92 KB, 下载次数: 63

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