找回密码
 立即注册

QQ登录

只需一步,快速开始

IvanBy
金牌服务用户   /  发表于:2017-6-5 16:27  /   查看:6770  /  回复:15


在这个帖子提到过自定义数据验证的http://gcdn.gcpowertools.com.cn/forum.php?mod=viewthread&tid=37521&extra=

现在发现有个问题,如果数据验证不通过,ValidationError事件触发有问题。比如第一次输入不正确的数据,单元格标红了,但没ValidationError,要第二次输入不正确的数据,才会ValidationError。

15 个回复

正序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-6-6 10:33:51
16#
IvanBy 发表于 2017-6-6 10:30
这还得显式地设定一些区域,也不现实

如果要设置全局也可以,但是其他单元格也会失去自动格式转换,都会默认转换为字符串。
像这样:
  1. var defaultStyle = new GcSpread.Sheets.Style();
  2.                         defaultStyle.formatter = "@";
  3.                         sheet.setDefaultStyle(defaultStyle, GcSpread.Sheets.SheetArea.viewport);
复制代码
回复 使用道具 举报
IvanBy
金牌服务用户   /  发表于:2017-6-6 10:30:02
15#
ClarkPan 发表于 2017-6-6 10:15
单元格自动转为日期对象这个功能是与Excel类似的,根据您的输入自动判断类型,如果不是已知类型则转为字 ...

这还得显式地设定一些区域,也不现实
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-6-6 10:15:45
14#
IvanBy 发表于 2017-6-5 18:37
嗯,我也用了createDateValidator。但就是如果可以用正则表达式处理就好点。先不管它了,我对日期对象转 ...

单元格自动转为日期对象这个功能是与Excel类似的,根据您的输入自动判断类型,如果不是已知类型则转为字符串显示。直接禁用是没办法的,但是可以设置单元格的formatter为"@",这样会使单元格默认以字符串的格式显示。变相的禁用了自动转换。
回复 使用道具 举报
IvanBy
金牌服务用户   /  发表于:2017-6-5 18:37:46
13#
ClarkPan 发表于 2017-6-5 18:28
因为您使用的是数据验证,那么验证的肯定是数据(value)而不是最终向用户呈现的text,这么说,当进行数 ...

嗯,我也用了createDateValidator。但就是如果可以用正则表达式处理就好点。先不管它了,我对日期对象转为字符串格式了。
对是,是否能全局禁用单元格自动转为日期对象?
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-6-5 18:28:53
12#
IvanBy 发表于 2017-6-5 17:59
但这样终究不灵活

因为您使用的是数据验证,那么验证的肯定是数据(value)而不是最终向用户呈现的text,这么说,当进行数据验证时已经将用户的输入转换为单元格的value了,只是还没有完成编辑存放至单元格中。如果您单纯是验证时间或者时间的范围区间,我们有专门的createDateValidator时间校验来做,如果您的校验中有逻辑,那么您可以在之前的方法中将获取的value format 为 string,如果您想要校验的是用户输入,那么您可以绑定editend时间来进行校验(这样您需要自己定义校验内容以及触发效果),所以您可以向我们描述一下您的需求,或者想要达到的效果,我们可以给您提供我们的建议,您可以当作参考。
回复 使用道具 举报
IvanBy
金牌服务用户   /  发表于:2017-6-5 17:59:57
11#
但这样终究不灵活
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-6-5 17:51:37
10#
IvanBy 发表于 2017-6-5 17:39
因为如果不是getText,输入日期格式的时候,它会自动转为日期对象,验证就无效了。比如输入 2017-6-5 , ...

看您的意思是需要校验时间,那么用value获得的就是一个JS源生的date类型,您可以根据您的需求调用其中的方法来进行判断,例如value.getTime(),value.getDate()等等。
回复 使用道具 举报
IvanBy
金牌服务用户   /  发表于:2017-6-5 17:39:00
9#
ClarkPan 发表于 2017-6-5 17:36
嗯,换了您提供的代码重现了问题,原因是这样的,evaluate的触发是在填写值之后,editend之前,所以那个 ...

因为如果不是getText,输入日期格式的时候,它会自动转为日期对象,验证就无效了。比如输入 2017-6-5 ,就会被转为日期对象,验证就有问题了
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2017-6-5 17:36:55
8#
本帖最后由 ClarkPan 于 2017-6-5 17:38 编辑
IvanBy 发表于 2017-6-5 17:27
知道了,可能是我的evaluate那有问题。我的是这样的

嗯,换了您提供的代码重现了问题,原因是这样的,evaluate的触发是在填写值之后,editend之前,所以那个时候用context.source.getSheet().getText(context.row, context.column);拿不到您填写的值,所以第一次会有问题。第二次其实取得时候也会有问题,因为拿到的是第一次填写上去的值。其实value = context.source.getValue(context.row, context.column),这个拿到的就是您填写的值。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部