DataGridView:行ヘッダー(左端)にエラーアイコンを表示して入力チェックを行う方法(サンプルあり)

📋 目次(クリックで展開)

DataGridView で入力チェック(バリデーション)を行う際、「不正な値が入力された場合は、その場で正しい値に修正するまで次のセルに移動させたくない」という厳格な画面制御を求められるケースは多いです。

しかし、フォーカスをそのセルに強制ロックした状態でセル単体のエラー(cell.ErrorText)を使用すると、編集用のテキストボックスの裏に赤い「!」マークが隠れてしまい、ユーザーにエラー理由が伝わらないという問題が起こります。

今回は、セルの編集状態に左右されず、画面の左端(行ヘッダー)にハッキリとエラーアイコンを表示させ、安全かつ確実にフォーカスをロックするバリデーションの実装方法について解説します。

行ヘッダーにエラーを表示するメリットについて

前回の記事では、ユーザーの移動を制限しない「セル単体のエラー(フリーフォーカス型)」をご紹介しました。これに対して、その場での修正を強制する「フォーカスロック型」を実装する場合は、セルではなく「行(Row)」に対してエラーを設定するのがベストプラクティスです。

DataGridView の各行の左端には、グレーの固定領域(行ヘッダー)が存在します。

行オブジェクトの ErrorText プロパティに文字列を設定すると、この行ヘッダー部分に赤いエラーアイコン(!)が表示されます。行ヘッダーは編集用のテキストボックスに覆い隠されることがないため、「ユーザーが文字や数値を入力・修正している最中」であっても、リアルタイムにエラーを認識させることができるという大きなメリットがあります。

また、数値型の列に文字(「a」など)が入力されて発生するシステムエラー(FormatException)のダイアログを抑制する DataError イベントとも非常に相性が良い手法です。

実装コード

以下は、数量(Quantity)列に対して、「0未満のマイナス値」が入力された場合や、「a」などの数値以外の文字が入力された場合に、行ヘッダーにエラーアイコンを表示して入力を強制ロックするサンプルコードです。

ユーザーが Esc キーを押して入力をキャンセル(リバート)した際に、残ってしまったエラーアイコンを綺麗に消し去る後処理(CellEndEdit)も含めて実装しています。

Form1.cs
using System.ComponentModel;
namespace DataGridView_Validation_Row_Error
{
public partial class Form1 : Form
{
private BindingList<ProductModel> _products = new();
public Form1()
{
InitializeComponent();
InitializeDataGridView();
}
private void InitializeDataGridView()
{
// サンプルデータの追加
_products.Add(new ProductModel("P001", "ノートパソコン", 1));
_products.Add(new ProductModel("P002", "USBメモリ", 5));
dataGridView1.DataSource = _products;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
// バリデーションに必要な3つのイベントを購読
dataGridView1.CellValidating += DataGridView1_CellValidating;
dataGridView1.DataError += DataGridView1_DataError;
dataGridView1.CellEndEdit += DataGridView1_CellEndEdit;
}
// ① 業務ルールチェック(マイナス値などの値を検証する)
private void DataGridView1_CellValidating(object? sender, DataGridViewCellValidatingEventArgs e)
{
var columnName = dataGridView1.Columns[e.ColumnIndex].DataPropertyName;
if (columnName == "Quantity")
{
string inputValue = e.FormattedValue?.ToString() ?? "";
var row = dataGridView1.Rows[e.RowIndex];
// 数値としてパースできる場合のみマイナスチェックを行う
if (int.TryParse(inputValue, out int quantity))
{
if (quantity < 0)
{
// 行ヘッダー(左端)にエラーメッセージを設定する
row.ErrorText = "数量には0以上の整数を入力してください。";
e.Cancel = true; // 正しい値になるまでセルをロック
}
else
{
row.ErrorText = string.Empty; // エラーをクリア
}
}
}
}
// ② 型変換エラー対策(文字入力時の不格好な標準ダイアログを抑制する)
private void DataGridView1_DataError(object? sender, DataGridViewDataErrorEventArgs e)
{
var columnName = dataGridView1.Columns[e.ColumnIndex].DataPropertyName;
if (columnName == "Quantity")
{
// 既定のエラーダイアログがポップアップするのを完全に阻止する
e.ThrowException = false;
// ダイアログを出す代わりに、行ヘッダーにエラーを表示してロックする
var row = dataGridView1.Rows[e.RowIndex];
row.ErrorText = "有効な数値を入力してください。";
e.Cancel = true;
}
}
// ③ エラークリア処理(ユーザーが Esc キーを押して入力を取り消した際の後処理)
private void DataGridView1_CellEndEdit(object? sender, DataGridViewCellEventArgs e)
{
// Escキーが押されると、値は自動的に編集前の正しい数値(0以上)に戻るため、
// 行ヘッダーのエラー表示をここで確実にクリアしてロックを解除する
var row = dataGridView1.Rows[e.RowIndex];
row.ErrorText = string.Empty;
}
}
// データモデルクラス
public class ProductModel
{
public string Code { get; set; }
public string Name { get; set; }
public int Quantity { get; set; }
public ProductModel(string code, string name, int quantity)
{
Code = code;
Name = name;
Quantity = quantity;
}
}
}

実行結果

数量(Quantity)列に「-1」を入力すると、行ヘッダーにエラーアイコンとエラーメッセージが表示されました。

サンプルアプリケーション

DataGridView_Validation_Row_Error.zip
※ サンプルアプリケーションは、.NET 9 をターゲットに作成しています。

注意点:行ヘッダーの表示設定

行ヘッダーにエラーアイコンを表示させるには、DataGridView コントロールの RowHeadersVisible プロパティが true になっている必要があります。

デザインの都合などで意図的に行ヘッダーを非表示(false)に設定している画面では、row.ErrorText を設定してもエラーアイコンが画面に表示されなくなってしまうため注意してください(デフォルト設定のままであれば true になっています)。

まとめ

今回は、DataGridView の行ヘッダー(左端)にエラーアイコンを表示して、安全に入力検証を行う方法について解説しました。

業務アプリケーションの要件によっては、入力ミスをその場で絶対にスルーさせないガチガチのバリデーションを組まなければならないケースが多々あります。

そのような場面では、今回ご紹介した row.ErrorText(行エラー)によるフォーカスロック を選択するのが最も確実です。

前回解説した「セルエラー(自由移動型)」と、今回の「行エラー(その場修正型)」の2つのアプローチを、システムの運用ルールや要件に合わせて適切に使い分けてみてください。

DataGridView を用いたバリデーション設計の引き出しとして、参考になれば幸いです。

関連記事


💬 コメント