找回密码
 立即注册

QQ登录

只需一步,快速开始

Wilson.Zhang
超级版主   /  发表于:2024-11-30 19:43  /   查看:6  /  回复:0
本帖最后由 Wilson.Zhang 于 2024-11-30 19:45 编辑

背景:基于某单元格区域建立区域快照,并拉伸区域快照以调整其尺寸,之后在引用区域插入或删除行发现区域快照尺寸不变,但其中的行高变低或变高。
问题原帖:https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=229932

这个现象与Microsoft Excel保持了相同的设计,如图1所示。区域快照是一个静态引用,对源区域插入行会影响快照内部,但是不会影响快照本身的尺寸和布局。针对这样的现象,用户如果想要让区域快照同步引用区域的行增删动作动态调整尺寸,就需要发挥主观能动性想办法自定义实现了。
100333xwomk7n4ocphk5cb.gif
图1. 区域快照

最简单的方法便是在确定引用区域不再需要增行或删行后再建立区域快照,如果用户的业务场景就需要随时根据需要对引用区域增行或删行,那么可以在每次增行或删行后将原有区域快照删除,再根据新引用区域重新建立快照,在得到新区域快照后再拉伸调节尺寸。虽然上述两种方案都能解决问题,但都存在一定程度的不便利性。前者太理想化,实际的业务场景可能就是充斥着频繁的对引用区域增行或删行。后者存在频繁的销毁和创建操作,可能会带来性能影响。好吧,咱们来分析下,区域快照的实体对应为一种被称作CameraShape的形状类型,该类型包含有height、width等设置或获取尺寸的方法,且ranges方法能获取到其引用区域。是否能够根据现有接口设计一个快照尺寸调节算法呢?具体思路如下:

1. 通过CameraShape:range()获取区域快照的引用区域,以此建立映射关系。
2. 区域快照中的行数和引用区域中的行数相同,且初始时行的高度相同,拉伸调节区域快照尺寸后通过CameraShape:height()获取区域快照的高度。同时,计算区域快照内的平均行高,并记录。
3. 对Workbook注册RowChanged事件,通过该事件监听增行和删行,判断监听到的行索引是否被包含在各区域快照引用区域中。如果是引用区域,根据映射关系获取区域快照实例。将插入或删除行数乘以区域快照平均行高即可得到变化高度,在区域快照现有高度基础上加上或减去变化高度即区域快照的新高度,再通过CameraShape:height()设置即可。

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部