作成日: 2025/12/12 最終更新日: 2026/05/13
文書種別
不具合
状況
修正済み
詳細
CollectionViewのgetErrorによる検証が設定された列にある結合セルを編集した場合、結合セル内の一番上のアイテムにエラーがある場合と、一番上以外のアイテムにエラーがある場合とで動作が異なり、正常な動作となりません。
回避方法
この問題はバージョン5.20261.50で修正されました。
修正版を適用しない場合の回避方法は次の通りです。
結合セルに対してgetErrorを正常に動作させるための有効な回避方法がございません。
次善策となりますが、以下のように独自実装にてセル編集の終了時に検証とエラー表示を行う方法をご検討ください。
//エラー表示用のツールチップ
const errorTip = new wijmo.Tooltip();
errorTip.isContentHtml = false;
errorTip.cssClass = 'wj-tooltip wj-error-tip';
// 'wj-state-invalid'が設定された要素にツールチップを
// 表示/非表示するためのリスナーをグリッドのホスト要素に追加
const host = grid.hostElement;
host.addEventListener('mouseover', (evt) => {
const cell = evt.target.closest('.wj-cell');
if (!cell) return;
if (cell.classList.contains('wj-state-invalid')) {
const msg = cell.dataset.errorMsg || '入力値エラー';
errorTip.show(cell, msg);
}
});
host.addEventListener('mouseout', (evt) => {
// マウスがセルから離れたら常に非表示にする(動作をシンプルに保つ)
const related = evt.relatedTarget;
if (!related || !host.contains(related)) errorTip.hide();
else {
const leftCell = evt.target.closest('.wj-cell');
const enteredCell = related.closest && related.closest('.wj-cell');
if (leftCell !== enteredCell) errorTip.hide();
}
});
// Escキーで編集キャンセル(ロールバック)する
let suppressValidation = false;// ガード用フラグ
host.addEventListener('keydown', (evt) => {
if (evt.key === 'Escape') {
// FlexGridが編集中かどうかを確認
if (!!grid.activeEditor) {
suppressValidation = true;
// アクティブセルの座標を取得
const r = grid.selection.row;
const c = grid.selection.col;
// エラー表示を消す
const cellEl = grid.cells.getCellElement(r, c);
if (cellEl) {
cellEl.classList.remove('wj-state-invalid');
delete cellEl.dataset.errorMsg
}
errorTip.hide();
// 編集中のエディタに元の値を戻す
grid.activeEditor.value = grid.getCellData(r, c);
// 編集をキャンセル
grid.finishEditing(false);
suppressValidation = false;
}
}
});
// セル編集の終了時に検証とエラー表示を行う
grid.cellEditEnding.addHandler((s, e) => {
// Escキーによるキャンセルでバリデーションの実行をスキップする処理
if (suppressValidation) {
return;
}
//入力値を取得
const editor = grid.activeEditor;
const newVal = (editor && editor.value !== undefined) ? editor.value : e.data;
const col = grid.columns[e.col];
if (!col) return;
//エラー表示をクリア
const cellEl = grid.cells.getCellElement(e.row, e.col);
if (cellEl) {
cellEl.classList.remove('wj-state-invalid');
delete cellEl.dataset.errorMsg;
errorTip.hide();
}
//アイテムに対して検証を行う(結合セル内の全アイテムが対象)
const mr = grid.mergeManager.getMergedRange(grid.cells, e.row, e.col) || new wijmo.grid.CellRange(e.row, e.col);
let hasError = false;
//
// 【略】要件に応じてエラーの有無をチェック
//
if (hasError) {
//エラーがあった場合、編集モードを維持してエラー表示する
e.cancel = true;
e.stayInEditMode = true;
if (cellEl) {
cellEl.classList.add('wj-state-invalid');
cellEl.dataset.errorMsg = '入力値エラー';
}
setTimeout(() => { try { if (grid.activeEditor) grid.activeEditor.focus(); } catch { } }, 0);
} else {
if (cellEl) {
cellEl.classList.remove('wj-state-invalid');
delete cellEl.dataset.errorMsg;
}
errorTip.hide();
}
});