找回密码
 立即注册

QQ登录

只需一步,快速开始

qq707820685

初级会员

32

主题

138

帖子

388

积分

初级会员

积分
388
qq707820685
初级会员   /  发表于:2017-4-21 10:03  /   查看:10815  /  回复:22
本帖最后由 ClarkPan 于 2017-4-21 15:40 编辑

由于我的需求有多个workbook,不同的sheet对delete键的需求不同,所有自定义自己的delete键不适合我,怎么获取sheet里delete键的事件?

22 个回复

倒序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-4-21 11:56:44
沙发
您好,我想您是不是需要问delete键触发RangeChanged事件相关,可以参考以下例子:
  1.     $(document).ready(function () {
  2.         var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 3 });
  3.                 var sheet = spread.getActiveSheet();
  4.                 sheet.bind(GC.Spread.Sheets.Events.RangeChanged, function (sender, args) {
  5.                         if(args.action == GC.Spread.Sheets.RangeChangedAction.clear){
  6.                                 alert("delete");
  7.                         }
  8.                 });
  9.     });
复制代码

希望对你有所帮助。
回复 使用道具 举报
qq707820685
初级会员   /  发表于:2017-4-21 12:03:53
板凳
ClarkPan 发表于 2017-4-21 11:56
您好,我想您是不是需要问delete键触发RangeChanged事件相关,可以参考以下例子:

希望对你有所帮助。

不行,我的sheet1绑定了sheet2, 每次sheet1 SelectionChanged,sheet2清空数据并且重新加载某些数据,
我试着将我的sheet2像你demo一样进行RangeChanged事件绑定,但是我sheet1每次进行SelectionChanged后都直接触发sheet2绑定的RangeChanged事件,没有按任何键。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-4-21 13:47:12
地板
我觉得你可能对RangeChanged会错意了,RangeChanged是一个触发事件,触发的方式可以有很多种,delete键触发是其中一种触发方式,因为有很多中触发方式,所以你需要在事件中进行判断
  1. if(args.action == GC.Spread.Sheets.RangeChangedAction.clear){
  2.                                 alert("delete");
  3.                         }
复制代码

上述代码就是对是否是delete触发RangeChanged事件的判断,另外我看到你重新编辑了问题,有着对不同sheet的delete事件有着不同的需求,那么你可以在判断中增加一个args.sheetName==目标sheet名称,里面写你自定义的逻辑。
以下逻辑可以参考:
  1. if(args.action == GC.Spread.Sheets.RangeChangedAction.clear){
  2.                                 //sheet1,sheet2,sheet3为目标sheet的名称
  3.                                 if(args.sheetName=="sheet1"){
  4.                                         alert("sheet1 delete");
  5.                                 }
  6.                                 if(args.sheetName=="sheet2"){
  7.                                         alert("sheet2 delete");
  8.                                 }
  9.                                 if(args.sheetName=="sheet3"){
  10.                                         alert("sheet3 delete");
  11.                                 }
  12.                         }
复制代码
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-4-21 13:51:08
5#
另外bind事件时就不能用sheet进行bind了,需要用spread进行bind
回复 使用道具 举报
qq707820685
初级会员   /  发表于:2017-4-21 14:04:08
6#
ClarkPan 发表于 2017-4-21 13:51
另外bind事件时就不能用sheet进行bind了,需要用spread进行bind

我在事件中进行判断了,现在的问题就是没有按delete键也触发了这个判断
回复 使用道具 举报
qq707820685
初级会员   /  发表于:2017-4-21 14:12:50
7#
ClarkPan 发表于 2017-4-21 13:51
另外bind事件时就不能用sheet进行bind了,需要用spread进行bind

我给你发下我的部分代码,sheetA和sheetB分别是两个workbook的sheet。
  function bindSheet(controller, sheetA, sheetB, setting){
        sheetA.bind(GC.Spread.Sheets.Events.SelectionChanged, function(sender, args){
            if(controller.tree.selected && args.oldSelections[0].row !== args.newSelections[0].row|| controller.tree.selected && args.oldSelections[0].row === 0){
                sheetB.clear(0, 0, sheetB.getRowCount(), sheetB.getColumnCount(), GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.data);
                sheetB.clear(0, 0, sheetB.getRowCount(), sheetB.getColumnCount(), GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.tag);
                    var jobs = controller.tree.selected.jobs;
                    if(jobs.length > 0){
                        for(var i=0; i<jobs.length; i++){
                            setting.cols.forEach(function(col, cidx){
                                sheetB.setTag(i, cidx, jobs.data.id, GC.Spread.Sheets.SheetArea.viewport);
                                if(jobs.data[col.data.field]){
                                    sheetB.getCell(i, cidx, GC.Spread.Sheets.SheetArea.viewport).value(jobs.data[col.data.field]);
                                }
                                else {
                                    sheetB.getCell(i, cidx, GC.Spread.Sheets.SheetArea.viewport).value('');
                                }
                            });
                            orgJobData = sheetB.getValue(0, 0);
                        }
                    }
            }
        });
    }


sheetB绑定的事件:
    delete: function(controller, sheet, totalJobs, setting){
        sheet.bind(GC.Spread.Sheets.Events.RangeChanged, function (sender, args) {
            if(args.action == GC.Spread.Sheets.RangeChangedAction.clear){
                alert("delete");
            }
        });
    }

回复 使用道具 举报
qq707820685
初级会员   /  发表于:2017-4-21 15:06:04
8#
ClarkPan 发表于 2017-4-21 13:47
我觉得你可能对RangeChanged会错意了,RangeChanged是一个触发事件,触发的方式可以有很多种,delete键触发 ...

可以帮忙解决下问题吗,谢谢
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-4-21 15:20:45
9#
本帖最后由 ClarkPan 于 2017-4-21 15:23 编辑
  1. sheetB.clear(0, 0, sheetB.getRowCount(), sheetB.getColumnCount(), GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.data);
  2. sheetB.clear(0, 0, sheetB.getRowCount(), sheetB.getColumnCount(), GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.tag);
复制代码

上述代码会以delete触发方式触发RangeChanged事件
我想您可能对delete理解有误,delete所指的不单单是键盘按下delete的操作,而是当前绑定的表单有clear的操作。
如果您单单只是想更改键盘按下delete按键的功能,你可以这么做:
  1.     $(document).ready(function () {
  2.                
  3.                 var spread1 = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 1 });
  4.                
  5.                 spread1.commandManager().register('mydelete',function(spread1){
  6.                         spread1.suspendEvent();
  7.                         alert("mydelete");
  8.                         spread1.resumeEvent();
  9.                 });
  10.                 //清空源生事件
  11.                 spread1.commandManager().setShortcutKey(null,GC.Spread.Commands.Key.del, false, false, false, false);
  12.                 //绑定自定义事件
  13.         spread1.commandManager().setShortcutKey('mydelete',GC.Spread.Commands.Key.del, false, false, false, false);
  14.                
  15.                 var spread2 = new GC.Spread.Sheets.Workbook(document.getElementById("dd"), { sheetCount: 1 });

  16.     });
复制代码


回复 使用道具 举报
qq707820685
初级会员   /  发表于:2017-4-21 15:32:51
10#
ClarkPan 发表于 2017-4-21 15:20
上述代码会以delete触发方式触发RangeChanged事件
我想您可能对delete理解有误,delete所指的不单单是键 ...

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