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

QQ登录

只需一步,快速开始

大Vi

高级会员

186

主题

410

帖子

1310

积分

高级会员

积分
1310
大Vi
高级会员   /  发表于:2025-4-14 08:49  /   查看:151  /  回复:6
1金币
本帖最后由 Matthew.Xue 于 2025-4-14 13:04 编辑


调研编号:GCNSJS-27808

针对现有的
  1. const checkbox = new GC.Spread.Sheets.CellTypes.CheckBoxList();
  2. checkbox.items(options);
复制代码
  1. const radio = new GC.Spread.Sheets.CellTypes.RadioButtonList();
  2. radio.items(options);
复制代码
  1. const combo = new GC.Spread.Sheets.CellTypes.ComboBox();
  2. combo.items(options)
复制代码
对于以上三种单元格类型,单元格在可编辑时展示对应的单元格,如果在不可编辑下,想以当前单元格的value值去匹配options的text,直接以text拼接的形式展示,这个如何实现呢?比如:付现款本来是,现在在单元格禁止的状态下,我想直接显示成【中文,英语】
企业微信截图_17445916945877.png

最佳答案

查看完整内容

每种单元格类型(Text、CheckBosList、Button)都可以认为是一个class,均继承自Base类型的单元格,以checkBoxList为例:CheckBoxList 这些class都有很多方法,其中就包括了单元格如何被绘制的方法paint,每种单元格类型的paint函数不同,它决定了单元格如何被绘制。 您的需求是在sheet没有被保护的情况下,正常展示CheckBoxList的样子,在sheet被保护的情况下,则展示文字,那么其实就是想用Text类型的绘制方式展示几个 ...

6 个回复

倒序浏览
最佳答案
最佳答案
Matthew.Xue
超级版主   /  发表于:2025-4-14 08:49:49
来自 7#
本帖最后由 Matthew.Xue 于 2025-4-17 12:05 编辑
大Vi 发表于 2025-4-17 11:11
是在被保护时,把原本设置了sheet.setCellType(row, col, combo);和改成sheet.setCellType(row, col, new ...

每种单元格类型(Text、CheckBosList、Button)都可以认为是一个class,均继承自Base类型的单元格,以checkBoxList为例:CheckBoxList
image.png23233031.png

这些class都有很多方法,其中就包括了单元格如何被绘制的方法paint,每种单元格类型的paint函数不同,它决定了单元格如何被绘制。

您的需求是在sheet没有被保护的情况下,正常展示CheckBoxList的样子,在sheet被保护的情况下,则展示文字,那么其实就是想用Text类型的绘制方式展示几个文字。翻译成代码,如下逻辑:
在sheet非保护的情况下,正常使用checkBoxList的paint函数,而在保护情况下,使用Text类型单元格的paint函数。
咱们看代码,在马赛克掉一些非核心代码后,其实就是上面说的逻辑:
image.png354844359.png

因为paint函数在绘制的时候,默认会根据单元格的值来绘制,而CheckBoxList单元格类型的值是一个value数组[cn, en],在sheet被保护时,你需要将其转换成中文“中文,英文”,并将其传入Text类型单元格的paint函数,被打码的那一部分代码,就是做这个工作。

这些代码是直接修改了GC变量,所以在您的代码中,只要在能访问到GC变量的地方,将那些代码加入即可生效。给您展示一下我这边的所有代码:
image.png959817504.png

可以看到,这段代码是通用的,是和业务是解耦的,您不必监听sheet的保护状态,也无需动态设置单元格的类型,它是直接作用于paint函数的,一切逻辑已经在paint函数内部实现了。


回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-4-14 12:14:38
2#
您好,问题已收到,正在调研中,请耐心等待,有进展会及时和您同步~
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-4-16 10:56:43
3#
本帖最后由 Matthew.Xue 于 2025-4-16 14:12 编辑

您好,久等了。和您同步一下调研的结论,您可以在工作表被保护时使用Text类型单元格的paint方法对单元格进行绘制,显示的内容可以通过单元格的值和复选框的选项来产生:
  1. let checkBoxListPaint = GC.Spread.Sheets.CellTypes.CheckBoxList.prototype.paintValue
  2. GC.Spread.Sheets.CellTypes.CheckBoxList.prototype.paintValue = function (ctx, value, x, y, w, h, style, context) {
  3.     let _sheet = context.sheet
  4.     if (style.locked && _sheet.options.isProtected) {
  5.         let items = style.cellType._items
  6.         let _value = []
  7.         if (value && Array.isArray(value)) {
  8.             _value = value
  9.         }
  10.         let str = items.filter(v => {
  11.             return _value.indexOf(v.value) > -1
  12.         }).map(v => {
  13.             return v.text
  14.         }).join(",")
  15.         GC.Spread.Sheets.CellTypes.Text.prototype.paintValue.apply(this, [ctx, str, x, y, w, h, style, context]);
  16.     }
  17.     else {
  18.         checkBoxListPaint.apply(this, arguments)
  19.     }
  20. }
复制代码
GIF 2025-4-16 10-52-25.gif
上面的代码是针对复选框列表类型的单元格,您还提到了其他两种类型的单元格,也可以参考上述代码,只是str变量的获取方式稍有不同,您需要查看style中的cellType,根据不同情况来编写代码。

回复 使用道具 举报
大Vi
高级会员   /  发表于:2025-4-16 16:07:09
4#
Matthew.Xue 发表于 2025-4-16 10:56
您好,久等了。和您同步一下调研的结论,您可以在工作表被保护时使用Text类型单元格的paint方法对单元格进 ...

请问有完整代码吗?
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-4-16 16:13:20
5#
大Vi 发表于 2025-4-16 16:07
请问有完整代码吗?

上面回复中的代码已经满足了您对复选框列表的需求,其代码是完整的,您可以直接使用。
其他单元格类型的代码,修改原理与上面代码相同,您可以自行实现。
回复 使用道具 举报
大Vi
高级会员   /  发表于:7 天前
6#
Matthew.Xue 发表于 2025-4-16 10:56
您好,久等了。和您同步一下调研的结论,您可以在工作表被保护时使用Text类型单元格的paint方法对单元格进 ...

是在被保护时,把原本设置了sheet.setCellType(row, col, combo);和改成sheet.setCellType(row, col, new customText());这种吗?然后重新写个单元格类型,我不明白你这段代码要怎么用的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部