前言
最近开发FineReport填报报表,在做一个复选按钮功能时遇到一个问题,已被编辑过的复选按钮,无法被重新批量编辑。FineReport版本是10。
问题描述
具体案例如下,B2和B3分别添加了复选按钮控件
,然后通过插入公式IF去判断,假如勾选了B2,那么B3所有的选择框都被勾选。
实测效果是可行的,如图。勾选前,
勾选后
反复勾选B2,都是没问题,说明公式的逻辑没有问题。
但问题出在,假如B3某一行被编辑过,然后取消。
再次点击全选,曾经被编辑过的那一行就不会被勾选。
原因暂时不明,怀疑是被编辑过的单元格,有一个默认的缓存值,导致插入公式不会再次被赋值?
解决方案
从这个案例看,通过插入公式实现批量勾选,效果并不理想。最优方案是通过JS代码调用,实现批量选择和取消选择。具体如下
1、命名控件
首先给B3的复选按钮控件
命名为box
2、添加控件事件
然后给B2的复选按钮控件
添加一个状态编辑的事件,通过js代码实现。
代码如下:
var flag = this.getValue();
//获取当前值
var boxes = _g().getWidgetsByName("box");
//获取当前页的复选按钮控件数组
if (typeof(boxes[0]) != "undefined") {
for (i = 0; i < boxes.length; i++) {
var cr=FR.cellStr2ColumnRow(boxes[i].options.location);
//获取行列号对象
_g().setCellValue(0,cr.col,cr.row,flag);
//如果控件大于1个,则遍历赋值
}
} else {
var cr=FR.cellStr2ColumnRow(boxes.options.location);
//获取行列号对象
_g().setCellValue(0,cr.col,cr.row,flag);
//如果控件只有1个,则直接赋值
}
如果安装了「控件性能优化」插件的话,JS代码可以修改为如下,页面的控件响应会更快。
var flag = this.getValue();
//获取当前值
var boxes = _g().getWidgetsByName("box");
//获取当前页的复选按钮控件数组
if (typeof(boxes[0]) != "undefined") {
var configs = [];
for (i = 0; i < boxes.length; i++) {
var cr=FR.cellStr2ColumnRow(boxes[i].options.location);
//获取行列号对象
configs.push({reportIndex:0,col:cr.col,row:cr.row,value:flag});
//如果控件大于1个,则遍历将行列号以及值信息插入数组中
}
_g().setCellsQuick(configs);
//批量赋值
//如果模板存在冻结,且被赋值单元格的行高列宽会改变,则需要替换此句为:_g().setCellsValueInBatch(configs);
} else {
var cr=FR.cellStr2ColumnRow(boxes.options.location);
//获取行列号对象
_g().setCellValue(0,cr.col,cr.row,flag);
//如果控件只有1个,则直接赋值
}
3、优化填报翻页时,全选按钮不刷新的问题
另外,如果使用了填报分页时,翻页后全选按钮的状态不会更新,此时需要在B2单元格(全选复选框),再添加一个初始化后事件来解决。
代码如下:
setTimeout(function() {
var isAllChecked = true;
//设置标记状态为选中
var boxes = _g().getWidgetsByName("box");
//获取当前页的复选按钮控件数组
if (typeof(boxes[0]) != "undefined") {
for (i = 0; i < boxes.length; i++) {
isAllChecked = boxes[i].getValue() == true ? isAllChecked : false;
//如果控件大于1个,则遍历获取值,一旦出现未选中状态的按钮,则将标记值改为false
}
} else {
isAllChecked = boxes.getValue();
//如果控件只有1个,则直接获取控件值,并传给标记值
}
_g().setCellValue(0, 1, 1, isAllChecked);
//将标记值赋给A2单元格
}, 50)
简单补充一下上面代码中的.setCellValue()
函数的参数,第一、第二和第三个参数是单元格的坐标。如上面(0,1,1)则表示sheet0的B2单元格,如果是(1,0,1)则表示sheet1的A2单元格。
这样就能实现翻页批量勾选和批量取消勾选的功能了。