请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

Wilson.Zhang
超级版主   /  发表于:2025-7-1 08:36  /   查看:20  /  回复:0
背景:单元格值变化后,如何了解变化情况,在此基础上定义业务逻辑。
问题原帖:https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=238836

在sheet中填报数据,可以通过CellChanged、ValueChanged事件监管单元格值变化。值发生变化的单元格被定义为脏单元格,SpreadJS内部管理了这些脏单元格,通过Worksheet:getDirtyCells()即可查看sheet内所有脏单元格。脏单元格是一种标识,标识因值改变而产生,Worksheet:clearPendingChanges()用于清除脏单元格标识。

如图1所示,CellChanged、ValueChanged、Workshet:getDirtyCells()记录的值变化单元格参数基本相同,其中row、col表示单元格行列索引,即单元格位置信息;oldValue、newValue分别存储了变化前后的单元格值。

图1. 单元格值变化监管

稍有区别的是,通过键盘对单元格输入值这一UI行为能够触发CellChanged、ValueChanged事件,而Worksheet:setValue()这一代码行为可以触发CellChanged事件,但无法触发ValueChanged事件,如图2所示。

图2. CellChanged和ValueChanged区别

CellChanged事件监听范围较广,单元格值变化仅是其中之一,属性propertyName记录了触发该事件的行为类型。如图3所示,单元格值变化时,CellChanged事件监听参数propertyName为value。那么,在通过CellChanged事件监听单元格值变化时,需要在事件处理函数中判别propertyName属性值是否为value。

图3. CellChanged事件propertyName

每次通过UI行为变更单元格值时,都能触发绑定在Worksheet和Workbook上的CellChanged事件和ValueChanged事件,同时对数据标脏,这样Worksheet:getDirtyCells()也能一次性检索到文件中的所有脏单元格。CellChanged和ValueChanged对单元格值变化的监管更实时,而Worksheet:getDirtyCells()在调用时才会通过单元格的脏标识检索。所以,如果对单元格值变化的时机要求更敏感,可以选择绑定CellChanged或ValueChanged事件;如果不在意单元格何时发生值变化,那就在需要了解时调用Worksheet:getDirtyCells()查看。

在对一个单元格多次修改值的过程中,Worksheet:getDirtyCells()只记录其最近一次的值变化情况。如图4所示,初始时,单元格A1无值,对应为JavaScript的undefined,首次填充1,Worksheet:getDirtyCells()返回结果中oldValue属性值为undefned,newValue属性值为1;随后分别修改A1值为2、3、4,Worksheet:getDirtyCells()并未对单元格A1增加新的数据变化记录,还是在原记录中更新oldValue和newValue属性值;最后,Worksheet:setValue()修改A1值4为5,Worksheet:getDirtyCells()同步获取到更新记录。

图4. 单元格值变化

综上,根据实际需求和值操作方式选择上述相应的方式监管单元格值变化即可。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

0 个回复

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