DataGridView で行追加できない・反映されない原因と解決方法(サンプルあり)

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

DataGridView を使用して行を追加しようとした際、コード実行時にエラーが発生したり、画面上に新規追加行が表示されなかったりすることがあります。

この記事では、DataGridView で行追加ができない原因と、その解決方法を紹介します。原因は大きく分けて、データバインド(DataSource の利用)をしているか否かで異なります。

データバインド時の行追加エラーと解決方法

データベースから取得したデータなどを表示するために、DataSource プロパティを使用して DataTable などを紐付けている場合、DataGridView に直接行を追加しようとするとエラーが発生します。

エラーが発生する実装例

// データバインドを行っている状態
/* this.dataGridView1.DataSource = myTable; */
private void btnAddNg_Click(object sender, EventArgs e)
{
try
{
// DataGridView に直接行を追加しようとするとエラーが発生します
this.dataGridView1.Rows.Add(99, "エラーテスト");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "エラー発生", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

上記を実行すると、「データバインドされている DataGridView コントロールに行をプログラムで追加することはできません。」という InvalidOperationException が発生します。データバインド中は、DataGridView はデータソースを映し出すビューとして機能するため、コントロール側に直接行を追加することはできません。

解決方法の実装例

DataGridView ではなく、バインドしているデータソース(DataTable など)に対して行を追加します。データソースを更新することで、DataGridView の表示にも自動的に連動して反映されます。

private void btnAddOk_Click(object sender, EventArgs e)
{
// DataSource から DataTable を取得
DataTable? dt = this.dataGridView1.DataSource as DataTable;
// DataTable のスキーマに合わせた新しい行を作成
DataRow row = dt.NewRow();
row["ID"] = dt.Rows.Count + 1;
row["名前"] = "新しいユーザー";
// DataTable に行を追加(DataGridView の表示も自動で更新されます)
dt.Rows.Add(row);
}

新規追加行が表示されない原因と解決策

プログラムからではなく、ユーザーに画面上で新しい行を直接入力させたい場合、DataGridView の一番下に新規入力用の空白行が表示されないことがあります。

この場合は、ユーザーによる行の追加を許可する AllowUserToAddRows プロパティが false になっていることが原因です。

実装コード

フォームのロード時などに、AllowUserToAddRows プロパティを true に設定します。また、プロパティウィンドウの「動作」カテゴリから直接 True に変更することも可能です。

// ユーザーによる新規行の追加を許可する
this.dataGridView1.AllowUserToAddRows = true;

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

ここまで解説した、データソースへの正しい行追加と、直接追加しようとした場合のエラーを両方確認できるサンプルアプリケーションです。フレームワークは .NET 9 を利用しています。

using System.Data;
namespace WaterMargin.WinForms.DgvRowAdd
{
public partial class Form1 : Form
{
private DataTable myTable;
public Form1()
{
InitializeComponent();
SetupDataGridView();
}
private void SetupDataGridView()
{
// DataTable の作成
myTable = new DataTable();
myTable.Columns.Add("ID", typeof(int));
myTable.Columns.Add("名前", typeof(string));
// 初期データの追加
myTable.Rows.Add(1, "田中");
myTable.Rows.Add(2, "佐藤");
// DataGridView に DataTable をバインドする
this.dataGridView1.DataSource = myTable;
// ユーザーによる新規行の追加を許可する
this.dataGridView1.AllowUserToAddRows = true;
}
private void btnAddOk_Click(object sender, EventArgs e)
{
// DataSource から DataTable を取得
DataTable? dt = this.dataGridView1.DataSource as DataTable;
// DataTable のスキーマに合わせた新しい行を作成
DataRow row = dt.NewRow();
row["ID"] = dt.Rows.Count + 1;
row["名前"] = "新しいユーザー";
// DataTable に行を追加(DataGridView の表示も自動で更新されます)
dt.Rows.Add(row);
}
private void btnAddNg_Click(object sender, EventArgs e)
{
try
{
// DataGridView に直接行を追加しようとするとエラーが発生します
this.dataGridView1.Rows.Add(99, "エラーテスト");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "エラー発生", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

実行結果

  • 「データソースに行を追加」ボタンをクリックした場合 バインドされている DataTable にデータが追加され、DataGridView 側にも新しい行が即座に表示されます。

  • 「直接行を追加 (エラー)」ボタンをクリックした場合 「データバインドされている DataGridView コントロールに行をプログラムで追加することはできません。」という内容のエラーメッセージボックスが表示されます。

サンプルアプリケーションのダウンロード

※ サンプルアプリケーションは、フレームワークに .NET 9 を利用しています。
DgvRowAdd.zip


💬 コメント