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
💬 コメント