找回密码
 立即注册

QQ登录

只需一步,快速开始

gjsucs

金牌服务用户

11

主题

31

帖子

317

积分

金牌服务用户

积分
317

[已处理] 单元格数字验证

gjsucs
金牌服务用户   /  发表于:2020-9-19 21:16  /   查看:2878  /  回复:6
想要实现:单元格内容只能填写数字,非数字不能提交。
找到:createNumberValidator ,但是只有等于 、大于等操作。有参考的api或者例子吗?

6 个回复

倒序浏览
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-9-21 11:29:23
沙发
您好,
用正则实现了一个自定义函数,然后给单元格添加这个自定义的公式验证器。
示例代码如下,具体您可以参考附件中的demo:
  1. function RegExFunction() {
  2.             this.name = "REGEX";
  3.             this.maxArgs = 2;
  4.             this.minArgs = 2;
  5.             this.typeName = "RegExFunction";
  6.         }
  7.         RegExFunction.prototype = new GC.Spread.CalcEngine.Functions.Function();
  8.         RegExFunction.prototype.isContextSensitive = function () {
  9.             return true;
  10.         }
  11.         RegExFunction.prototype.evaluate = function () {
  12.             var context = arguments[0], value = context.source.getValue(context.row, context.column);
  13.             var reg = new RegExp(arguments[1]);
  14.             if (value) {
  15.                 return reg.test(value.toString());
  16.             }
  17.             return false;
  18.         }
复制代码
另一种方法是不使用数据验证,通过 监听EditEnding事件,判断输入内容是否为数字,如果不是数字则 args.cancel = true;
EditEnding 事件API 如下:
https://demo.grapecity.com.cn/sp ... ml#event:EditEnding
您可以根据需要自己选择。


数据验证_自定义公式验证_只允许输入数字.html

3.62 KB, 下载次数: 100

回复 使用道具 举报
gjsucs
金牌服务用户   /  发表于:2020-9-21 20:23:20
板凳
args.cancel = true;  这个方法好用,但是有个副作用,如果是非法数据,esc也不能取消编辑状态。这个怎么解决?
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-9-22 11:31:45
地板
如果是非法数据,不能退出编辑状态,这个其实就是实现了 非数字不能提交。只有输入了数字,才能正常退出编辑状态。
所以 非数字不能提交 和 非法数据时能退出编辑状态 二者是有冲突的。
基于上面的这种冲突,这边有个折中的处理(附件为示例demo):

使用EditEnded事件,当判断为非数字时,使用clear方法清空输入内容。
示例代码如下:
  1. sheet.bind(GC.Spread.Sheets.Events.EditEnded, function (sender, args) {
  2.             var text = args.editingText;
  3.             console.log(args)
  4.             if (!Number(text)) {
  5.                 sheet.clear(args.row,args.col,1,1,GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.data);
  6.             }
  7.         });
复制代码

clear方法 API 如下:
https://demo.grapecity.com.cn/sp ... orksheet.html#clear

需要注意的一点就是,这种方式下已输入的内容会被清空,需要再次重新输入。



demo.html

2.83 KB, 下载次数: 62

回复 使用道具 举报
gjsucs
金牌服务用户   /  发表于:2020-9-23 07:49:49
5#
esc能还原到输入之前的值吗?
回复 使用道具 举报
gjsucs
金牌服务用户   /  发表于:2020-9-23 08:11:47
6#
这种方式不让输入,怎么增加提示比较好?
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-9-23 10:43:39
7#
事件监听不让非数值输入的方式下,增加提示需要自己在事件监听时实现,SJS没有对应的提示设置。
前面提到的 数据验证 SJS有在输入和数据无效时有对应的提示接口,推荐您使用这种方式,效果如下方动图所示:
如动图中所示,在设置了数据验证的单元格输入时,会出现提示信息,代码如下:
  1. var dv1 = sheet.getDataValidator(0, 0);
  2.     dv1.inputTitle('Please choose a category:'); // 提示标题
  3.     dv1.inputMessage('Fruit, Vegetable, Food'); //提示内容
复制代码
当输入无效的数据时,数据验证会触发 ValidationError 事件。
  1. sheet.bind(GC.Spread.Sheets.Events.ValidationError, function(e, args) {
  2.        //do some thing
复制代码
您可以在学习指南上体验动图所示的提示效果和参考相关代码,地址如下:
https://demo.grapecity.com.cn/sp ... ta-validator/purejs








demo1.gif
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部