在提交单元格编辑和行编辑的时点,将会运行指定在各个列的验证。 另外,GridBase.onValidateCell事件将会提供又一次验证的机会。
可以在DataColumn.validations属性中,指定一个以上的验证,并且如果在指定的多个验证中,即使一个验证没有被通过, 也会在提交变更时抛出例外。 另外,在提交之前,数据单元格中将会显示错误图标。验证是分别指定在各个列中的(而非数据字段)。
下列例题中,已设置了"产品代码"列中"必须要有值。"的条件。 有关表达式语法,请参考表达式概述主题。 有关被用于列EditValidation的表达式的变量列表,请参考验证概述主题。
column.setValidations([{
"expression": "值不能为空。",
"level": DataLudi.ValidationLevel.WARNING,
"message": strings["CommCodeMsg"]
}]);
我们可以通过"error"、"warning"、"info"、"ignore"等四种ValidationLevel常数而指定level, 并且如果发生验证失败,相关数据单元格将会被设置为这些错误级别。 之后,当提交编辑行时, 如果情况比起通过网格editOptions的commitLevel设置的错误级别更为严重,就会导致编辑提交失败。
我们可以通过空出产品代码的值并更改下列commtLevel设置而进行测试。
我们也可以实现只在行添加或修改时运行验证。 在例题中,"年度"列的两个EditValidation.mode已分别设置为"insert"和"update"。 如果没有被设置,则会一直运行"always"。
column.setValidations([{
"expression": "value >= 2000",
"level": DataLudi.ValidationLevel.INFO,
"message": "年度必须要大于2000。",
"mode": DataLudi.ValidationMode.INSERT
}, {
"expression": "value < 22000",
"level": DataLudi.ValidationLevel.INFO,
"message": "年度必须要小于2020。",
"mode": DataLudi.ValidationMode.UPDATE
}]);
替代使用SMART datagrid本身的表达式语法的expression的方式, 也可以通过在使用JavaScript的callback属性中,指定回调函数并运行验证。 有关传递至回调函数中的scope参数,请参考验证概述主题。
column.setValidations([{
"callback": function (scope) {
if (scope.value < 1000) {
return false;
}
},
"level": DataLudi.ValidationLevel.ERROR,
"message": "交易额必须要大于1000。"
}]);
如果在回调函数中明确返回false,就会导致验证失败。
替代在DataColumn.validations属性中设置EditValidation的方式, 也可以通过编写网格的onValidateCell事件处理器,运行单元格验证。
进行行编辑时,在提交单元格编辑之前,将会触发onValidateCell事件。 如果在这个事件处理器中,调用throwValidationError并抛出例外,则会得出与使用Validation对象进行验证相同的结果。 下列例题中,如果"交易量"字段的值低于100,就会以ERROR级别导致验证失败。
grid.onValidateCell = function (grid, index, inserting, value) {
if (index.dataField() == dsMain.getFieldIndex('weight')) {
if (value <= 100) {
DataLudi.throwValidationError(DataLudi.ValidationLevel.ERROR, strings['WeightMsg']);
}
}
};