動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
C#

定石3: CellBeginEdit / CellEndEdit / RowValidatingの使い分け

出典: WinForms DataGridView の編集モード完全ガイド — ReadOnly / EditMode / RowValidating の使い分け定石3: CellBeginEdit / CellEndEdit / RowValidatingの使い分け

定石3: CellBeginEdit / CellEndEdit / RowValidatingの使い分け (csharp)#511ed36968b3
// ✅定石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 は実行結果未収録
▸ 実行結果は未収録です
  • id: #511ed36968b3
  • lines: 59
  • extracted: 2026-06-10

Source収録記事

この snippet は記事の「定石3: CellBeginEdit / CellEndEdit / RowValidatingの使い分け」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。

同じ記事から

4
図鑑トップ