本帖最后由 Grayson.Shang 于 2024-7-30 09:23 编辑
对于使用了活字格一段时间的我,觉得页面上单元的条件格式很好用,可以根据页面上一些值,设置动态的只读和编辑状态,就感觉很好用,不知道大家有没有用起来,是不是觉得很好用呢?
但在使用过程中就会纳闷,活字格许多数的数据都需要使用表格来展示和填报,表格的编辑不能灵活地设置成动态编辑可太难受了
前段时间,我找到了一个贴子,发现之前已经有格友在论坛中有示例,通过调用活字格的JSAPI完成这个功能,然后我惊喜异常,茶不思饭不想,就去钻研这个帖子了。今天也想给大家粘贴出来,但发现找不到了
不过幸好,我保存了当时的demo,我就和大家分享一下
功能的实现主要依靠的是JS,我先把JS给大家展示出来,具体解释的代码中也有注释
- var page = Forguncy.Page;
- var listView = page.getListView("表格1");
- var activeSheet = listView.getControl().getActiveSheet();
- // 获取不可编辑列
- var noEdit = 0;
- // 获取判定列
- var reg = 2;
- // 定义编辑触发事件,
- activeSheet.bind(GC.Spread.Sheets.Events.EditStarting, function (sender, args) {
- // 获取表格已有数据行数
- let count = listView.getRowCount();
- // 只对非新增行做是否编辑控制
- if (args.row < count) {
- // 获取表格当前设置行,判定列的值
- // getValue,是按照表格单元格展示的,从0开始,若存在行头,也会被计算
- // reg,从0开始,若存在行头,也会被计算
- let colx = listView.getValue(args.row, reg);
- // 设置当前设置行,第noEidt列,当第colx的值等于0的时候,编辑取消
- // args.col,是按照数据的顺序展示的,从0开始,表头不计入
- // 若有多列不可以编辑,可以将下面的条件代码重复即可
- if (args.col == noEdit && colx == 0) {
- args.cancel = true;
- return;
- }
- }
- });
复制代码
1. 表格名称
2. 不可编辑列
3. 判定列
代码已贴,大家直接拷贝使用即可,不过今天主要分享的是,在8.1中如何将这个和组件联合起来使用~_~
为什么将这么一个功能,却要和组件联系到一起呢?其实因为这个JS中需要输入三个参数,在这三个参数一致的情况下,其实并不需要再看JS代码了,那么包装起来才是开发的真理,本来想要开发插件,但想起来自己没有经验,学习成本又高,就想着如何降低一下门槛,突然想到8.1的组件是可以给组件中属性赋值的
那么今天大课堂正式开始
1. 创建一个组件,定义好组件名,设定三个属性,名称分别为表格名,不可编辑列,判定列,这里建议都使用公式(这里定义的属性名称,后面尽量不要改变,因为被引用的地方不会跟着改变,我被这里坑了好多次)
2. 设置组件的值变更命令,主要的区别就是获取前面三个属性值到JS中,其他的和代码提到的一致,大家应该了解JS中存在获取变量和页面值的命令,我这里使用变老了,方便不污染页面
3. 将前面的代码加入到这里的JS命令中,然后修改前面获取值的部分
- var page = Forguncy.Page;
- // 获取表格名
- var listViewName = Forguncy.CommandHelper.getVariableValue("表格名");
- var listView = page.getListView(listViewName);
- var activeSheet = listView.getControl().getActiveSheet();
- // 获取不可编辑列
- var noEdit = Forguncy.CommandHelper.getVariableValue("NoEditCol");
- // 获取判定列
- var reg = Forguncy.CommandHelper.getVariableValue("regex");
复制代码 到此组件就已经定义完成了,具体的使用就变得很简单了。
1. 将组件拖到页面上,然后给对应的属性赋值,可以是定值,也可以引用动态的值,我这里选择表格名定值,不可编辑列和判定列都是动值
2. 当这三个值为空时,这段JS不会被执行,当这三个值不为空,会执行JS,表格对应的就不可以编辑了
总结一下优缺点:
优点:使用组件可以定义一个类似接口的插件,完成一个功能的包装,后面使用起来也会很方便,不同页面,不同的表格,拖动一个组件就可以完成了,还可以导入到其他demo中使用
缺点:输入的列序号,不能被限制当超出表格列范围,比如-1,或者大于等于表格列数,前端会报错,但在JS中不能查到表格的列数,所以做不了,限制,想使用trycatch捕获,但是报错的地方catch捕获不到(不知道原因,有大佬知道欢迎交流)
|
|