请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

qq707820685

初级会员

32

主题

138

帖子

388

积分

初级会员

积分
388
qq707820685
初级会员   /  发表于:2017-12-11 11:39  /   查看:7852  /  回复:17
sheet.repaint()方法是重绘整个表吗,如果是的话,那我只想重绘某个单元格,或者某块区域,有解决方案吗

17 个回复

倒序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-12-11 17:24:01
沙发
您好,请问您具体需求是什么,需要进行重绘处理。是因为性能问题吗?
回复 使用道具 举报
qq707820685
初级会员   /  发表于:2017-12-12 08:40:17
板凳
ClarkPan 发表于 2017-12-11 17:24
您好,请问您具体需求是什么,需要进行重绘处理。是因为性能问题吗?

   getDynamicCombo: function () {
        let ComboCellForActiveCell = function () { };
        ComboCellForActiveCell.prototype = new GC.Spread.Sheets.CellTypes.ComboBox();
        ComboCellForActiveCell.prototype.paintValue = function (ctx, value, x, y, w, h, style, options) {
            let sheet = options.sheet;
            if (options.row === sheet.getActiveRowIndex() && options.col === sheet.getActiveColumnIndex()) {
                GC.Spread.Sheets.CellTypes.ComboBox.prototype.paintValue.apply(this, arguments);

            } else {
                GC.Spread.Sheets.CellTypes.Base.prototype.paintValue.apply(this, arguments);
            }
        };
        ComboCellForActiveCell.prototype.getHitInfo = function (x, y, cellStyle, cellRect, options) {
            let sheet = options.sheet;
            if (options.row === sheet.getActiveRowIndex() && options.col === sheet.getActiveColumnIndex()) {
                return GC.Spread.Sheets.CellTypes.ComboBox.prototype.getHitInfo.apply(this, arguments);

            } else {
                return GC.Spread.Sheets.CellTypes.Base.prototype.getHitInfo.apply(this, arguments);
            }
        };
        return new ComboCellForActiveCell();
    },

想要实现一个自定义的单元格, 下拉框只有在焦点进入单元格了才出现,焦点移除下拉框消失, 不在EnterCell事件中添加sheet.repaint()方法的话无法达到效果,用了repaint()方法会导致性能问题
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-12-12 16:11:47
地板
您好,请问您是真的遇到性能问题了,还是感觉sheet.repaint()方法会导致性能问题。因为是这样的,spreadjs中当任何单元格需要重绘时都是触发sheet.repaint()操作,但是并没有用户抱怨过这样有性能问题。所以您可以试试这样做是否会有性能问题。如果有性能问题,您也可以进行一个判断不如下面这样:
var flag = false;
                sheet.bind(GC.Spread.Sheets.Events.LeaveCell, function (sender, args) {
                        var celltype = sheet.getCellType(args.row,args.col);
                        if(celltype instanceof ComboCellForActiveCell){
                                flag = true;
                        }
                });
                sheet.bind(GC.Spread.Sheets.Events.EnterCell, function (sender, args) {
                        if(flag == true){
                                sheet.repaint();
                                flag = false;
                        }
                });
通过判断减少重绘次数
回复 使用道具 举报
qq707820685
初级会员   /  发表于:2017-12-12 16:37:37
5#
ClarkPan 发表于 2017-12-12 16:11
您好,请问您是真的遇到性能问题了,还是感觉sheet.repaint()方法会导致性能问题。因为是这样的,spreadjs ...

因为自定义画出来的单元格比较多,数据也比较庞大(不是帖中的动态combo),加EnterCell事件进行repaintcombo后,页面明显没有不加时流畅
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-12-12 16:40:40
6#
那就是向我上面说的,通过判断来减少repaint的次数。
回复 使用道具 举报
qq707820685
初级会员   /  发表于:2017-12-12 16:41:20
7#
ClarkPan 发表于 2017-12-12 16:11
您好,请问您是真的遇到性能问题了,还是感觉sheet.repaint()方法会导致性能问题。因为是这样的,spreadjs ...

您好,我想问一下,repaint方法是重绘整个表的单元格,和单元格数据吗?
回复 使用道具 举报
qq707820685
初级会员   /  发表于:2017-12-12 17:22:12
8#
ClarkPan 发表于 2017-12-12 16:40
那就是向我上面说的,通过判断来减少repaint的次数。

我觉得,repaint某个Range的方法还是很有必要的...你这个解决方法,在操作到相关的单元格,流畅性还是下降的,只是减少出现的几率
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-12-12 17:53:13
9#
那只能帮您将提一个新需求给相关部门,至于做不做还需要相关部门讨论最终决定。
回复 使用道具 举报
qq707820685
初级会员   /  发表于:2018-5-11 17:44:39
10#
ClarkPan 发表于 2017-12-12 17:53
那只能帮您将提一个新需求给相关部门,至于做不做还需要相关部门讨论最终决定。

某一列进行是问题中的动态单元格,通过监听enterCell事件进行repaint(),现在遇到问题:焦点在该列时,按住键盘↓,能明显感觉到卡顿,请问有解决方案吗
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部