slickgrid ( nsunleo-slickgrid ) 3 修正区域选择不能跨冻结列的问题

  上次解决区域选择不能跨冻结列问题的时候,剩了个尾巴,从右往左选择的时候,会出现选择不正常的情况,后续对这个问题进行了修正。

在修正问题前,需要选择的方向,即从左往右还是从右往左选择(L->R Or R->L)。

  确定是否跨区域,前提知道选择的方向,即(L->R && Start <= frozenColumn && End > frozenColumn || R->L && Start>frozenColumn && End <=frozenColumn) 。

  从选择方向得知,我们需要记录开始和结束 (Start ,End)。

  上述准备条件之后剩下的就是计算border了,L->R的情况跨区域的时候 L的右边框0,R->L 的时候,R的左边框0。

  起点问题 ,L->R跨区域的情况,R的Left为0;R->L跨区域的情况,L的起点为L父容器的宽度- 当前的左起点。

  分析之后,改造代码:

  

function handleDrag(e, dd) {
if (!_dragging) {
return;
}
e.stopImmediatePropagation(); var end = _grid.getCellFromPoint(
e.pageX - _$activeCanvas.offset().left + _columnOffset,
e.pageY - _$activeCanvas.offset().top + _rowOffset
); if ((!_grid.canCellBeSelected(end.row, end.cell))
//|| (!_isRightCanvas && (end.cell > _gridOptions.frozenColumn))
//|| (_isRightCanvas && (end.cell <= _gridOptions.frozenColumn))
//|| ( !_isBottomCanvas && ( end.row >= _gridOptions.frozenRow ) )
|| (_isBottomCanvas && (end.row < _gridOptions.frozenRow))
) {
return;
} dd.range.end = end;
var canvas = $(_grid.getActiveCanvasNode(e));
_decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell), {
start: _startCell.cell,
canvas: canvas,
end: dd.range.end.cell
});
}
function show(range, cfg) {
var canvas = cfg.canvas;
var start = cfg.start;
var end = cfg.end;
var from = grid.getCellNodeBox(range.fromRow, range.fromCell);
var to = grid.getCellNodeBox(range.toRow, range.toCell); // range left to right
var directLR = start <= end;
// frozenColumn temp var
var frozenColumn = grid.getOptions().frozenColumn; var lR = false;
// lR true condition
if (directLR) {
lR = start <= frozenColumn && end > frozenColumn;
} else {
lR = start > frozenColumn && end <= frozenColumn;
} if (!_elem) {
_elem = $("<div></div>", { css: options.selectionCss })
.addClass(options.selectionCssClass)
.css("position", "absolute")
.appendTo(grid.getActiveCanvasNode());
_borderWidth = _elem.css("border-left-width");
} // lr ,create new element .
if (lR && !_rElem) {
_rElem = $("<div></div>", { css: options.selectionCss })
.addClass(options.selectionCssClass)
.css("position", "absolute")
.appendTo(canvas);
} // ! lr ,remove _rElem
if (!lR && _rElem) {
_rElem.remove();
_rElem = null;
} var temp = lR && directLR ? _rElem : _elem;
var lWidth = lR ? directLR ? canvas.width() : to.right - 2 : (to.right - from.left - 2);
var lLeft = lR && !directLR ? 0 : (from.left - 1);
//console.log("DIRECT_LR:" + directLR + " FROM_L:" + from.left + " TO_L:" + to.left + " FROM_R:" + from.right + " TO_R" + to.right + " START:" + start + " END:" + end + " LWIDTH:" + lWidth)
if (_elem) {
_elem.css("border-right-width", lR ? directLR ? "0px" : _borderWidth : _borderWidth);
_elem.css("border-left-width", lR ? directLR ? _borderWidth : "0px" : _borderWidth);
_elem.css({
top: from.top - 1,
left: lLeft,
height: to.bottom - from.top - 2,
width: lWidth
});
} if (_rElem) {
var rLeft = directLR ? 0 : from.left;
var rWidth = !directLR ? canvas.width() : (to.right - 2);
//console.log("RWIDTH:" + rWidth + " RLEFT:" + rLeft);
_rElem.css("border-left-width", lR ? directLR ? "0px" : _borderWidth : _borderWidth);
_rElem.css("border-right-width", lR ? directLR ? _borderWidth : "0px" : _borderWidth);
_rElem.css({
top: from.top - 1,
left: rLeft,
height: to.bottom - from.top - 2,
width: rWidth
});
} return temp;
}

修正后的结果:

OK 到这里,未完待续!

最新文章

  1. Bluetooth Low Energy 嗅探
  2. vue.js 2.0开发(4)
  3. dos 批处理删除svn目录
  4. js高阶函数
  5. BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇
  6. IO流 总结二
  7. Bzoj1818: [Cqoi2010]内部白点 &amp;&amp; Tyvj P2637 内部白点 扫描线,树状数组,离散化
  8. 全面修复IE,注册IE所有dll
  9. Day3 - Linux系统安装_Centos6.9
  10. 【剑指Offer学习】【面试题21:包括min 函数的栈】
  11. BZOJ 3173: [Tjoi2013]最长上升子序列 [splay DP]
  12. Unity3D学习(六):《Unity Shader入门精要》——Unity的基础光照
  13. idea怎么配置spring
  14. 笨办法11提问-raw_input
  15. 用 TensorFlow 实现 k-means 聚类代码解析
  16. docker 创建tomcat镜像
  17. VS 2015 序列号/密钥/企业版/专业版
  18. HDU1502 Regular Words DP+大数
  19. 使用Log4J监控系统日志邮件警报
  20. 状态模式c#(状态流转例子吃饭)

热门文章

  1. C# 特殊符号
  2. 记一次 Billu_b0x渗透
  3. AbstractQueuedSynchronizer解析
  4. 微信公众号 webfullstack
  5. GitHub Packages
  6. Visual Studio Online &amp; Web 版 VS Code
  7. 如何用JavaDoc命令生成帮助文档
  8. Java volatile 关键字底层实现原理解析
  9. 从零开始搞后台管理系统(1)——shin-admin
  10. 1053 Path of Equal Weight——PAT甲级真题