行の編集が完了する時、そして行の編集を完了する時点でカラム毎に指定された 検証を実行する また、GridBase.onValidateCellイベントがもう一回の検証の機会を提供する。
DataColumn.validationsプロパティーに一つ以上のValidationが指定できて、 指定したValidationの中で一つでも通過できないと変更の完了の時に例外が発生する。 また、完了の前にはデータセルにエラーアイコンが表示される。Validationはデータフィールドではなくカラム毎に指定する。
下のサンプルで"製品コード"カラムには"必ず値があるべきである。"といる条件が設定された。 Expression文法についてはExpression概要トピックを参考する。 カラムEditValidationの表現式に使える変数の目録はValidation概要トピックを参考する。
column.setValidations([{
"expression": "value is not empty",
"level": DataLudi.ValidationLevel.ERROR,
"message": strings["CommCodeMsg"]
}]);
levelは"error"、"warning"、"info"、"ignore"などValidatioLevelの定数四つで指定することができて、 検証に失敗したらが該当データセルはこのエラーレベルで設定される。 以後行の編集完了の時グリッドeditOptionsのcommitLevelで設定したエラーレベルより深刻な場合完了が失敗になる。
製品コードの値を空けてcommtLevel設定を変えながらテストしてみる。
Validationが行を追加する時、もしくは行の修正の時だけに実行されるようにすることもできる。 サンプルで"年"カラムの二つの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パラメーターについてはValidation概要トピックを参考する。
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']);
}
}
};