找回密码
 立即注册

QQ登录

只需一步,快速开始

旺仔老博文

注册会员

8

主题

26

帖子

88

积分

注册会员

积分
88
旺仔老博文
注册会员   /  发表于:2024-12-12 14:44  /   查看:64  /  回复:5
10金币
本帖最后由 旺仔老博文 于 2024-12-12 15:08 编辑
  1. // 清除所有脏数据标记
  2.       sheet.clearPendingChanges({
  3.         clearType: 1, // 1 表示清除所有更改状态
  4.         row: -1, // -1 表示所有行
  5.         rowCount: -1, // -1 表示所有行
  6.         col: -1, // -1 表示所有列
  7.         colCount: -1, // -1 表示所有列
  8.       });
  9.       // 设置修改脏数据背景色
  10.       const dirtyStyle = new GC.Spread.Sheets.Style();
  11.       dirtyStyle.backColor = '#FFD698';
  12.       for (const row of res.rtnData.editableRows) {
  13.         const editRange = new GC.Spread.Sheets.Range(row, 0, 1, columns.length);
  14.         sheet.cellStates.add(
  15.           editRange,
  16.           GC.Spread.Sheets.CellStatesType.dirty,
  17.           dirtyStyle,
  18.         );
  19.       }
复制代码
我希望设置可编辑行的脏数据状态,可编辑行是动态的也就是res.rtnData.editableRows,下次请求数据时上一次绑定的脏数据行格式仍然生效;clearPendingChanges无效

5 个回复

倒序浏览
Wilson.Zhang
超级版主   /  发表于:7 天前
沙发
您好!可以通过Worksheet:getDirtyRows()获取脏数据行,参考如下代码也可以对脏数据行中的脏数据单元格设置统一的样式:
  1. let dirtyStyle = new GC.Spread.Sheets.Style();
  2. dirtyStyle.backColor = '#FFD698';
  3. for (let row of sheet.getDirtyRows()) {
  4.     let editRange = new GC.Spread.Sheets.Range(row.row, 0, 1, sheet.getColumnCount());
  5.     sheet.cellStates.add(editRange, GC.Spread.Sheets.CellStatesType.dirty, dirtyStyle);
  6. }
复制代码

您的代码片段中“res.rtnData.editableRows”是您自定义的变量吗?如果是SpreadJS的内部变量,不建议您这样使用,因为版本更新可能会改变某些内部变量,这些变化的内部变量可能正是您在使用的,这样就会影响您代码的正常运行。
建议您使用公开的API访问。
回复 使用道具 举报
旺仔老博文
注册会员   /  发表于:7 天前
板凳
本帖最后由 旺仔老博文 于 2024-12-13 09:48 编辑
Wilson.Zhang 发表于 2024-12-12 15:31
您好!可以通过Worksheet:getDirtyRows()获取脏数据行,参考如下代码也可以对脏数据行中的脏数据单元格设置 ...

不太能用你这种方法,res.rtnData.editableRows是后台动态获取的,告诉前端哪些行可以编辑,而我的脏数据标记也只针对这些可编辑行,不可编辑行绑定了一些公式根据编辑行的输入能自动计算,然而这些行我不需要标记。所以我循环res.rtnData.editableRows绑定,现在我的问题是绑定的没有问题,但是再次请求数据,上次绑定的脏数据标记的行仍然生效,比如上次标记了49行是可编辑行输入后会脏数据标记,再次请求数据49行变成了不可编辑行此时脏数据标记仍然存在,一旦值变化了就被标记了
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:6 天前
地板
旺仔老博文 发表于 2024-12-12 17:10
不太能用你这种方法,res.rtnData.editableRows是后台动态获取的,告诉前端哪些行可以编辑,而我的脏数据 ...

根据您提供的信息,再次请求得到新数据后,之前的脏数据行仍然是脏数据行,但是此时为了与填充新请求得到的数据行以区别,需要清除掉原来脏数据行的背景色,而只对新数据行设置脏数据背景色。如此往复,每次请求得到新数据填充在sheet中都需要清除上一次的新数据行,只保留当前新数据行的背景色。

我理解您的需求场景如上所述,那么,clearPendingChanges清除了当前脏数据行的状态,然后再使用Workbook:refresh()刷新一下即可看到清除脏状态后样式也清除的效果。

可以参考如下代码:
  1. //  设置脏状态样式
  2. let dirtyStyle = new GC.Spread.Sheets.Style();
  3. dirtyStyle.backColor = '#FFD698';
  4. for (let row of sheet.getDirtyRows()) {
  5.     let editRange = new GC.Spread.Sheets.Range(row.row, 0, 1, sheet.getColumnCount());
  6.     sheet.cellStates.add(editRange, GC.Spread.Sheets.CellStatesType.dirty, dirtyStyle);
  7. }

  8. //  清除脏状态样式
  9. sheet.clearPendingChanges({
  10.     clearType: 1, // 1 表示清除所有更改状态
  11.     row: -1, // -1 表示所有行
  12.     rowCount: -1, // -1 表示所有行
  13.     col: -1, // -1 表示所有列
  14.     colCount: -1, // -1 表示所有列
  15. });
  16. spread.refresh();
复制代码
回复 使用道具 举报
旺仔老博文
注册会员   /  发表于:6 天前
5#
Wilson.Zhang 发表于 2024-12-13 10:37
根据您提供的信息,再次请求得到新数据后,之前的脏数据行仍然是脏数据行,但是此时为了与填充新请求得到 ...
  1. // 设置修改脏数据背景色
  2.       // const dirtyStyle = new GC.Spread.Sheets.Style();
  3.       // dirtyStyle.backColor = '#FFD698';
  4.       // for (const row of res.rtnData.editableRows) {
  5.       //   const editRange = new GC.Spread.Sheets.Range(row, 0, 1, columns.length);
  6.       //   sheet.cellStates.add(
  7.       //     editRange,
  8.       //     GC.Spread.Sheets.CellStatesType.dirty,
  9.       //     dirtyStyle,
  10.       //   );
  11.       // }
  12.       const dirtyStyle = new GC.Spread.Sheets.Style();
  13.       dirtyStyle.backColor = '#FFD698';
  14.       for (const row of sheet.getDirtyRows()) {
  15.         console.log('sheet.getDirtyRows()', sheet.getDirtyRows());
  16.         const editRange = new GC.Spread.Sheets.Range(
  17.           row.row,
  18.           0,
  19.           1,
  20.           sheet.getColumnCount(),
  21.         );
  22.         sheet.cellStates.add(
  23.           editRange,
  24.           GC.Spread.Sheets.CellStatesType.dirty,
  25.           dirtyStyle,
  26.         );
  27.       }
  28.       //  清除脏状态样式
  29.       sheet.clearPendingChanges({
  30.         clearType: 1, // 1 表示清除所有更改状态
  31.         row: -1, // -1 表示所有行
  32.         rowCount: -1, // -1 表示所有行
  33.         col: -1, // -1 表示所有列
  34.         colCount: -1, // -1 表示所有列
  35.       });
  36.       spreadInstance.refresh();
复制代码

按照你得循环绑定脏数据const row of sheet.getDirtyRows(),首页页面的脏数据标记功能都无法实现了,注释的代码是我原来的逻辑,可以标记脏数据,clearPendingChanges     spreadInstance.refresh();之后上面我描述的问题仍然存在,再次请求数据原来标记过的行的脏数据状态仍然存在
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:6 天前
6#
旺仔老博文 发表于 2024-12-13 11:12
按照你得循环绑定脏数据const row of sheet.getDirtyRows(),首页页面的脏数据标记功能都无法实现了, ...

因为我的环境没有res.rtnData.edittableRows这个变量,而且我理解您在反馈的是脏数据行的状态设置与清除,所以我用了Worksheet:getDirtyRows()获取sheet中的脏数据行。

您可以将sheet.getDirtyRows()更换为您的脏数据变量测试下。另外,据您之前所说res.rtnData.editableRows是后台动态获取的,那么需要确认该变量中包含的数据对应的行是否为脏数据行,即行中单元格状态是否为dirty。如果不是dirty,设置了脏状态样式后,单元格成为脏状态才能生效。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部