本帖最后由 Wilson.Zhang 于 2024-11-30 19:41 编辑
背景:单元格区域中各单元格的锁定状态不一致,如何判断区域的锁定状态。
问题原帖:https://gcdn.grapecity.com.cn/showtopic-229511-1-1.html
SpreadJS允许对单元格单独设置锁定状态为true或false,相邻单元格之间的锁定状态相互独立。假定存在这样一个单元格区域,其中间或有锁定状态分别为true和false的单元格,而业务场景需要判断这个区域的锁定状态,SpreadJS现有设计以区域左上角单元格锁定状态为返回结果。这样的设计有其合理性,既然区域中单元格的锁定状态并不一致,如何评断便交由用户来决定,那么,常规思维便以区域左上角单元格锁定状态为默认返回结果。当然,这是默认设计,用户在实际开发时,针对具体业务场景可以自行定义如何界定区域的锁定状态,少数服从多数是一个可行的建议原则。
一般地,一个区域内单元格锁定状态无外乎三种情况,即,锁定状态全为true、锁定状态全为false、和锁定状态不一致。无论是否一致,都需要遍历区域内所有单元格访问其锁定状态后才能得到统计结果。在此,以不一致的单元格锁定状态场景为例,介绍下少数服从多数的统计规则。具体地,如下所述:
1. 自定义按钮以查看所选区域锁定状态,在选中区域后,代替原生右键菜单“设置单元格格式-->保护-->锁定”选项。(也可以自定义右键菜单选项代替。)
2. 在自定义按钮的点击事件中,通过Worksheet:getSelections()获取被选择的区域,记为SelectionArea。
3. 以先行后列的顺序遍历SelectionArea中的单元格,并设置一个初始值为0的临时计数变量,在遍历过程中遇到单元格锁定状态为true时加1、为false时减一。
4. 直至遍历结束,计数变量的值大于等于0即代表区域中锁定状态为true的单元格数量更多,即可认为区域锁定状态为true,反之同理,计数变量小于0即锁定状态为false。此处需要注意一点,如果区域内单元格数量为偶数,且锁定状态为true和false的单元格数量相同,那么可以灵活地认为区域锁定状态为true或false,本文认为此种情景的区域锁定状态为true。
上述方案不仅是少数服从多数原则的区域锁定状态判定规则,对锁定状态一致的单元格区域同样有效。除此之外,假定单元格锁定状态为true是正常态,也可以认为只要区域中存在有至少一个单元格的锁定状态为false就认为是异常态,那么此时即可终止遍历。同理,也可以认为只要存在锁定状态为true的单元格其所在区域锁定状态即为true。综上所述,对于区域的锁定状态判断规则并不固定,用户完全可以根据实际场景灵活定义。
本文所述方案实现效果如图1所示,对C1: D2区域内的四个单元格分别设置锁定状态为true,上述方案可以获得区域锁定状态为true;之后全都修改为false,获取锁定状态为false;继续修改C1:C2单元格锁定状态为true,true和false对半分的情况下区域锁定状态为true;继续修改D1锁定状态为true,少数服从多数规则确定区域锁定状态为true。附上demo抛砖引玉,以供参考。
图1. 区域锁定状态判断 |
|