C#
定石3: CellBeginEdit / CellEndEdit / RowValidatingの使い分け
出典: WinForms DataGridView の編集モード完全ガイド — ReadOnly / EditMode / RowValidating の使い分け — 定石3: CellBeginEdit / CellEndEdit / RowValidatingの使い分け
// ✅定石3:編集イベントの3段階制御
// 1. CellBeginEdit:編集モードに入る直前
private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
//業務ロジックで「編集禁止条件」がある場合
if (dataGridView1.Rows[e.RowIndex].Cells["status"].Value?.ToString()== "確定済み")
{
e.Cancel = true; // ←編集モードに入るのをキャンセル
}
}
// 2. CellEndEdit:編集モードを抜けた瞬間(値が確定)
private bool _isEditing = false; //無限ループ防止フラグ
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (_isEditing)return; //再入防止
_isEditing = true;
try
{
//セルの値を加工したい場合(例:金額のカンマ整形)
if (dataGridView1.Columns[e.ColumnIndex].Name == "amount")
{
var raw = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value?.ToString();
if (decimal.TryParse(raw, out var amount))
{
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = amount.ToString("N0");
}
}
}
finally
{
_isEditing = false;
}
}
// 3. RowValidating:行を抜けるタイミング(行全体の検証)
private void dataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
var row = dataGridView1.Rows[e.RowIndex];
if (row.IsNewRow)return; //新規行はスキップ
//必須項目チェック
if (string.IsNullOrEmpty(row.Cells["name"].Value?.ToString()))
{
MessageBox.Show("名前は必須です");
e.Cancel = true; // ←行確定をキャンセル
return;
}
//金額チェック
if (decimal.TryParse(row.Cells["amount"].Value?.ToString(), out var amount))
{
if (amount < 0)
{
MessageBox.Show("金額は0以上を入力してください");
e.Cancel = true;
}
}
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「定石3: CellBeginEdit / CellEndEdit / RowValidatingの使い分け」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
4 件// ✅定石1: ReadOnlyの3層階層 //階層1:コントロール全体(最強・最もシンプル) dataGridView1.ReadOnly = true; dataGridView1.AllowUserToAddRows = false; //新規追加行も無効化未収録
定石1: ReadOnlyの3層階層—コントロール/列・行/セル
#548f6ae7bc2a
// ✅定石2: EditMode 4種類の挙動 // 1. EditOnEnter:セルにフォーカスが入った瞬間に編集モード(既定値: EditOnKeystrokeOrF2) dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;未収録
定石2: EditMode 4種類の使い分け—編集開始タイミング制御
#d2b3e420786d
// ✅定石4: EditingControlShowingで数値のみ入力を強制 private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (dataGridView1.CurrentCell?.OwningColumn.Name == "amount")未収録
定石4: EditingControlShowingでIME /数値制限を仕込む
#d9111a623822
// ❌ NG: DataBound前にRows[i].ReadOnlyを設定(消える) private void Form_Load(object sender, EventArgs e) { dataGridView1.DataSource = LoadFromDb();未収録
定石5: DataBindingCompleteで行単位ReadOnlyを維持
#644e739d514b
