旺仔老博文 发表于 2024-12-12 14:44:16

v14清除所有脏数据标记

本帖最后由 Wilson.Zhang 于 2025-1-3 15:12 编辑

// 清除所有脏数据标记
      sheet.clearPendingChanges({
      clearType: 1, // 1 表示清除所有更改状态
      row: -1, // -1 表示所有行
      rowCount: -1, // -1 表示所有行
      col: -1, // -1 表示所有列
      colCount: -1, // -1 表示所有列
      });
      // 设置修改脏数据背景色
      const dirtyStyle = new GC.Spread.Sheets.Style();
      dirtyStyle.backColor = '#FFD698';
      for (const row of res.rtnData.editableRows) {
      const editRange = new GC.Spread.Sheets.Range(row, 0, 1, columns.length);
      sheet.cellStates.add(
          editRange,
          GC.Spread.Sheets.CellStatesType.dirty,
          dirtyStyle,
      );
      }我希望设置可编辑行的脏数据状态,可编辑行是动态的也就是res.rtnData.editableRows,下次请求数据时上一次绑定的脏数据行格式仍然生效;clearPendingChanges无效


产品:SpreadJS
版本:14
调研编号:SJS-27747
Last Review:2025-01-03
当前进展:设计是在清除脏单元格状态后刷新Worksheet或Workbook显示效果,非功能问题。

Wilson.Zhang 发表于 2024-12-12 15:31:33

您好!可以通过Worksheet:getDirtyRows()获取脏数据行,参考如下代码也可以对脏数据行中的脏数据单元格设置统一的样式:
let dirtyStyle = new GC.Spread.Sheets.Style();
dirtyStyle.backColor = '#FFD698';
for (let row of sheet.getDirtyRows()) {
    let editRange = new GC.Spread.Sheets.Range(row.row, 0, 1, sheet.getColumnCount());
    sheet.cellStates.add(editRange, GC.Spread.Sheets.CellStatesType.dirty, dirtyStyle);
}
您的代码片段中“res.rtnData.editableRows”是您自定义的变量吗?如果是SpreadJS的内部变量,不建议您这样使用,因为版本更新可能会改变某些内部变量,这些变化的内部变量可能正是您在使用的,这样就会影响您代码的正常运行。
建议您使用公开的API访问。

旺仔老博文 发表于 2024-12-12 17:10:48

本帖最后由 旺仔老博文 于 2024-12-13 09:48 编辑

Wilson.Zhang 发表于 2024-12-12 15:31
您好!可以通过Worksheet:getDirtyRows()获取脏数据行,参考如下代码也可以对脏数据行中的脏数据单元格设置 ...
不太能用你这种方法,res.rtnData.editableRows是后台动态获取的,告诉前端哪些行可以编辑,而我的脏数据标记也只针对这些可编辑行,不可编辑行绑定了一些公式根据编辑行的输入能自动计算,然而这些行我不需要标记。所以我循环res.rtnData.editableRows绑定,现在我的问题是绑定的没有问题,但是再次请求数据,上次绑定的脏数据标记的行仍然生效,比如上次标记了49行是可编辑行输入后会脏数据标记,再次请求数据49行变成了不可编辑行此时脏数据标记仍然存在,一旦值变化了就被标记了

Wilson.Zhang 发表于 2024-12-13 10:37:35

旺仔老博文 发表于 2024-12-12 17:10
不太能用你这种方法,res.rtnData.editableRows是后台动态获取的,告诉前端哪些行可以编辑,而我的脏数据 ...

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

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

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

//清除脏状态样式
sheet.clearPendingChanges({
    clearType: 1, // 1 表示清除所有更改状态
    row: -1, // -1 表示所有行
    rowCount: -1, // -1 表示所有行
    col: -1, // -1 表示所有列
    colCount: -1, // -1 表示所有列
});
spread.refresh();

旺仔老博文 发表于 2024-12-13 11:12:59

Wilson.Zhang 发表于 2024-12-13 10:37
根据您提供的信息,再次请求得到新数据后,之前的脏数据行仍然是脏数据行,但是此时为了与填充新请求得到 ...

// 设置修改脏数据背景色
      // const dirtyStyle = new GC.Spread.Sheets.Style();
      // dirtyStyle.backColor = '#FFD698';
      // for (const row of res.rtnData.editableRows) {
      //   const editRange = new GC.Spread.Sheets.Range(row, 0, 1, columns.length);
      //   sheet.cellStates.add(
      //   editRange,
      //   GC.Spread.Sheets.CellStatesType.dirty,
      //   dirtyStyle,
      //   );
      // }
      const dirtyStyle = new GC.Spread.Sheets.Style();
      dirtyStyle.backColor = '#FFD698';
      for (const row of sheet.getDirtyRows()) {
      console.log('sheet.getDirtyRows()', sheet.getDirtyRows());
      const editRange = new GC.Spread.Sheets.Range(
          row.row,
          0,
          1,
          sheet.getColumnCount(),
      );
      sheet.cellStates.add(
          editRange,
          GC.Spread.Sheets.CellStatesType.dirty,
          dirtyStyle,
      );
      }
      //清除脏状态样式
      sheet.clearPendingChanges({
      clearType: 1, // 1 表示清除所有更改状态
      row: -1, // -1 表示所有行
      rowCount: -1, // -1 表示所有行
      col: -1, // -1 表示所有列
      colCount: -1, // -1 表示所有列
      });
      spreadInstance.refresh();
按照你得循环绑定脏数据const row of sheet.getDirtyRows(),首页页面的脏数据标记功能都无法实现了,注释的代码是我原来的逻辑,可以标记脏数据,clearPendingChanges   spreadInstance.refresh();之后上面我描述的问题仍然存在,再次请求数据原来标记过的行的脏数据状态仍然存在

Wilson.Zhang 发表于 2024-12-13 17:14:59

旺仔老博文 发表于 2024-12-13 11:12
按照你得循环绑定脏数据const row of sheet.getDirtyRows(),首页页面的脏数据标记功能都无法实现了, ...

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

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

Wilson.Zhang 发表于 6 天前

您好!关于您的这个问题,我调研后了解到当前的设计就是在清除脏单元格状态后刷新才能看到效果,Workbook:refresh()或者Worksheet:repaint()刷新即可。
页: [1]
查看完整版本: v14清除所有脏数据标记