記事内に広告が含まれています。

Windows Forms:DataGridView グリッド全体・行・セルの編集制御(サンプルあり)

2024年9月8日

DataGrid の全体・列・セル・行に関して、プロパティでの編集制御、イベントでの編集制御の方法を紹介します。

グリッド全体の編集制御

グリッド全体を編集できないようにするには、DataGridView.ReadOnly プロパティを有効化(true)します。

this.dataGridView1.ReadOnly = true;

特定セルの編集制御(プロパティ利用)

特定セルを編集できないようにするには、セルの ReadOnly プロパティを利用します。

// 列名と行インデックスでのセル指定の場合
this.dataGridView1["Name", 1].ReadOnly = true;

// 列インデックスと行インデックスでのセル指定の場合
this.dataGridView1[1, 1].ReadOnly = true;

特定セルの編集制御(イベント制御利用)

イベントによる、特定セルの編集制御を行うには、CellBeginEdit イベントを利用します。例えば、特定セルに対する編集をキャンセルする場合、次のように CurrentCell のセル位置を条件に、編集をキャンセルします。他にも、別のセルの値や状態など、必要な条件による編集制御が可能です。

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    //特定セルの編集制御(イベント制御利用)
    if (this.dataGridView1.CurrentCell == this.dataGridView1[1, 2])
    {
        e.Cancel = true;
    }
}

特定列の編集制御(プロパティ利用)

特定列を編集できないようにするには、列の ReadOnly プロパティを利用します。

// 列名での列指定の場合
this.dataGridView1.Columns["Age"].ReadOnly = true;

// 列インデックスでの列指定の場合
this.dataGridView1.Columns[2].ReadOnly = true;

特定列の編集制御(イベント制御)

イベントによる、特定列の編集制御を行うには、CellBeginEdit イベントをハンドルし、CurrentCell プロパティ の 列情報(ここでは列インデックス)をもとに、e.Cancel = true として編集をキャンセルします。

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    //特定列の編集制御(イベント制御)
    if (this.dataGridView1.CurrentCell.ColumnIndex == 0)
    {
        e.Cancel = true;
    }
}

特定行の編集制御(プロパティ利用)

特定行を編集できないようにするには、Row の ReadOnly プロパティを利用します。

this.dataGridView1.Rows[3].ReadOnly = true;

特定行の編集制御(イベント制御)

イベントによる、特定列の編集制御を行うには、CellBeginEdit イベントをハンドルし、CurrentCell プロパティ の 行情報(ここでは行インデックス)をもとに、e.Cancel = true として編集をキャンセルします。

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
	//特定行の編集制御(イベント制御)
	if (this.dataGridView1.CurrentCell.RowIndex == 3)
	{
	    e.Cancel = true;
	}
}

行削除の制御

グリッド全体での行削除の制御を行うには、AllowUserToDeleteRows プロパティを利用します。デフォルトで有効化されているので、無効化する際には、AllowUserToDeleteRows プロパティに false を設定します。

this.dataGridView1.AllowUserToDeleteRows = false;

特定行での行削除の制御を行うには、UserDeletingRow イベントをハンドルし、キャンセル条件に合致すれば、e.Cancel = true とします。

private void dataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
    // 特定行での行削除の制御
    if(e.Row.Index == 0)
    {
        e.Cancel = true;
    }
}

サンプル

サンプルアプリケーションは、.NET 8 で作成されています。利用にあたっては、後続の注意点をご参照ください。

実行結果

サンプルアプリケーションの注意点

ID 列のすべてのセルと Name 列 3 行目は、75-94 行目の実装により、編集不可の設定となっております。

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    //特定セルの編集制御(イベント制御利用)
    if (this.dataGridView1.CurrentCell == this.dataGridView1[1, 2])
    {
        e.Cancel = true;
    }

    //特定列の編集制御(イベント制御)
    if (this.dataGridView1.CurrentCell.ColumnIndex == 0)
    {
        e.Cancel = true;
    }

    ////特定行の編集制御(イベント制御)
    //if (this.dataGridView1.CurrentCell.RowIndex == 3)
    //{
    //    e.Cancel = true;
    //}
}

-Windows Forms