如何在不关闭对话框时验证Dynamics 365 FFO的DialogField?
问题描述
在Dynamics 365 FFO中,希望在不关闭对话框(不在closeOK方法中)的情况下实时验证DialogField的输入值,当前代码如下:
class myClassCaller { MyClassDialog::MyPromtDialog(`parameters`); } class MyClassDialog { static container MyPromtDialog(`parameters`) { DialogField myDialogField; Dialog dialog; // 其他初始化代码.......... myDialogField = dialog.addField(extendedtypestr(MYEDT),"Label","Label"); // 希望在这里检查/验证DialogField的值 if (! dialog.run()) return ['', '']; // 后续处理逻辑..... return localContainer; } }
请问是否有办法拦截输入到myDialogField中的值?
解决方案
有两种常用方式可以实现实时拦截并验证DialogField的输入值:
1. 注册modified事件处理方法
通过给DialogField注册自定义的modified方法,在用户输入值并离开字段时触发验证逻辑:
static container MyPromtDialog(`parameters`) { DialogField myDialogField; Dialog dialog; // 其他初始化代码.......... myDialogField = dialog.addField(extendedtypestr(MYEDT),"Label","Label"); // 注册modified事件的自定义处理方法 myDialogField.registerOverrideMethod(methodStr(FormStringControl, modified), methodStr(MyClassDialog, myDialogField_Modified), this); if (! dialog.run()) return ['', '']; // 后续处理逻辑..... return localContainer; } // 自定义的modified事件处理方法 public boolean myDialogField_Modified(FormStringControl _control) { boolean ret = _control.modified(); str inputValue = _control.text(); // 在这里编写你的验证逻辑 if (strLen(inputValue) < 5) { error("输入值长度不能小于5位!"); // 可清空输入或聚焦回字段 _control.text(''); _control.setFocus(); ret = false; } return ret; }
2. 利用EDT的validate方法
如果MYEDT是自定义扩展数据类型,可直接在EDT的validate方法中编写验证逻辑,所有使用该EDT的DialogField都会自动触发验证:
- 打开
MYEDT的扩展数据类型设计器 - 重写
validate方法,添加验证逻辑:
public boolean validate(Common _record) { boolean ret = super(_record); str inputValue = this.valueStr(); if (strLen(inputValue) < 5) { error("输入值长度不能小于5位!"); ret = false; } return ret; }
内容的提问来源于stack exchange,提问作者ulisses
相关产品推荐
相关产品推荐

