【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にメッセージをセットすると、視覚的にわかりやすいエラー表示ができる
  • 行の存在チェックを入れて、削除中などの例外的なタイミングに備える

次回は、チェックボックス列・コンボボックス列といった特殊な列タイプを扱います。

訪問数 5 回, 今日の訪問数 5回

広告

WindowsFormアプリ

Posted by hidepon