关于FineReport复选按钮批量勾选的实现

前言

最近开发FineReport填报报表,在做一个复选按钮功能时遇到一个问题,已被编辑过的复选按钮,无法被重新批量编辑。FineReport版本是10。

问题描述

具体案例如下,B2和B3分别添加了复选按钮控件,然后通过插入公式IF去判断,假如勾选了B2,那么B3所有的选择框都被勾选。

file

实测效果是可行的,如图。勾选前,

file

勾选后
file

反复勾选B2,都是没问题,说明公式的逻辑没有问题。

但问题出在,假如B3某一行被编辑过,然后取消。

file

再次点击全选,曾经被编辑过的那一行就不会被勾选。
file

原因暂时不明,怀疑是被编辑过的单元格,有一个默认的缓存值,导致插入公式不会再次被赋值?

解决方案

从这个案例看,通过插入公式实现批量勾选,效果并不理想。最优方案是通过JS代码调用,实现批量选择和取消选择。具体如下

1、命名控件

首先给B3的复选按钮控件命名为box

file

2、添加控件事件

然后给B2的复选按钮控件添加一个状态编辑的事件,通过js代码实现。

file

代码如下:

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单元格(全选复选框),再添加一个初始化后事件来解决。

file

代码如下:

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单元格。

这样就能实现翻页批量勾选和批量取消勾选的功能了。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇