【C#】DataGridViewで入力値をバリデーションする ~CellValidatingイベント~
DataGridViewを編集可能なフォームとして使う場合、「数値の列に文字列が入力された」「必須項目が空のまま次のセルに移動しようとした」といった入力ミスを防ぎたくなります。本記事ではCellValidatingイベントを使った入力チェックの実装方法を紹介します。
1. CellValidatingイベントの基本
CellValidatingはセルの編集を終えて、フォーカスが別のセルに移ろうとするタイミングで発生します。ここで値をチェックし、問題があればe.Cancel = trueとすることでフォーカス移動をキャンセルできます。
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
// Age列のみチェック対象にする
if (dataGridView1.Columns[e.ColumnIndex].Name != "Age") return;
string input = e.FormattedValue.ToString();
if (!int.TryParse(input, out int age))
{
dataGridView1.Rows[e.RowIndex].ErrorText = "数値を入力してください。";
e.Cancel = true;
return;
}
if (age < 0 || age > 120)
{
dataGridView1.Rows[e.RowIndex].ErrorText = "年齢は0~120の範囲で入力してください。";
e.Cancel = true;
return;
}
// 問題なければエラー表示をクリア
dataGridView1.Rows[e.RowIndex].ErrorText = "";
}
Rows[e.RowIndex].ErrorTextに文字列をセットすると、行の左端にエラーアイコン(赤い!マーク)が表示され、マウスホバーでメッセージが確認できます。ユーザーへのフィードバックとして非常にわかりやすい仕組みです。
2. 必須入力チェックの例
空欄を許可したくない列も同様のパターンでチェックできます。
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (dataGridView1.Columns[e.ColumnIndex].Name != "Name") return;
if (string.IsNullOrWhiteSpace(e.FormattedValue?.ToString()))
{
dataGridView1.Rows[e.RowIndex].ErrorText = "名前は必須項目です。";
e.Cancel = true;
}
else
{
dataGridView1.Rows[e.RowIndex].ErrorText = "";
}
}
3. キャンセル時の挙動に注意する
e.Cancel = trueにすると、そのセルにフォーカスが留まり続けます。行削除やフォームを閉じる操作もブロックされるため、ユーザーが編集を諦めて元に戻したい場合の逃げ道(Escキーでのキャンセル編集)も考慮しておくとよいでしょう。DataGridViewはデフォルトでEscキーによる編集キャンセルに対応しているので、特別な実装は不要です。
また、CellValidatingは行の削除中やDataGridView自体の破棄中にも呼ばれることがあるため、行やセルの存在チェックを入れておくと安全です。
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (e.RowIndex < 0 || e.RowIndex >= dataGridView1.Rows.Count) return;
// ここから通常のチェック処理
}
まとめ
- セルの入力チェックには
CellValidatingイベントを使い、問題があればe.Cancel = true Rows[].ErrorTextにメッセージをセットすると、視覚的にわかりやすいエラー表示ができる- 行の存在チェックを入れて、削除中などの例外的なタイミングに備える
次回は、チェックボックス列・コンボボックス列といった特殊な列タイプを扱います。




ディスカッション
コメント一覧
まだ、コメントがありません