DataGridView:新規追加行の表示・非表示制御と注意点(サンプルあり)

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

Windows Formsの開発において、一覧データを表示・編集する際によく使われる DataGridView コントロールですが、デフォルトの状態では、ユーザーが新しいデータを入力できるように、最下行に「*」マークがついた新規追加行(新しく行を追加するための空白行)が表示されます。

便利な機能ですが、実務のアプリケーション開発においては、以下のようなケースで「この新規追加行を表示させたくない」という場面が多々あります。

  • データの追加は専用の入力ダイアログから行わせたい
  • 読み取り専用(閲覧メイン)の画面にしたい
  • 外部のデータソースと連動しており、勝手に行を追加されると困る

本記事では、DataGridView の新規追加行を制御する基本プロパティと、実務で注意したいデータソース(DataSource)との関係まで解説します。

新規追加行の表示切り替え:AllowUserToAddRows プロパティ

DataGridView の新規追加行を非表示にするには、AllowUserToAddRows プロパティfalse に設定します。

コードでの設定方法

フォームのロードイベントなどで、以下のように記述することで制御可能です。

C#
// 新規追加行を非表示にする
dataGridView1.AllowUserToAddRows = false;

逆に、ユーザーに直接入力による行追加機能を提供する場合は、true(デフォルト値)を設定します。

C#
// 新規追加行を表示する(デフォルト)
dataGridView1.AllowUserToAddRows = true;

デザイナー(GUI)での設定方法

Visual Studioのフォームデザイナーから変更することも可能です。

  1. フォーム上の DataGridView を選択します。
  2. 右下の「プロパティ」ウィンドウを開きます。
  3. AllowUserToAddRows を探し、ドロップダウンから True / False を選択します。

確認ポイント:新規追加行が表示されない3つの原因

AllowUserToAddRows = true にしているのに、なぜか新規追加行が表示されない…」というのは、Windows Forms 開発でよくあるトラブルの一つです。以下の3つの原因をチェックしてみて下さい。

原因①:ReadOnly プロパティが true になっている

DataGridView 全体、または行の読み取り専用設定(ReadOnly)が true になっている場合、データの編集ができないため、新規追加行は強制的に非表示になります。

C#
// ReadOnly が true だと、AllowUserToAddRows = true にしていても表示されません。
dataGridView1.ReadOnly = true;

原因②:データソース(DataSource)側が「行の追加」を禁止している

DataGridViewDataTableBindingList などのデータソースをバインドしている場合、データソース側の権限が優先されます。 例えば、DataView をバインドしており、その AllowNew プロパティが false になっている場合、DataGridView 側で AllowUserToAddRows = true にしても新規行は表示されません。

原因③:カスタムクラスに「引数なしコンストラクタ」がない

オブジェクトのリスト(BindingList<T> など)をデータソースにする場合、そのクラスに引数なしのパブリックなコンストラクタが必要です。

C# の仕様上、クラスにコンストラクタを何も書かなければ「引数なしコンストラクタ」が自動生成されるため問題なく動きます。しかし、実務で「引数付きコンストラクタ」を1つでも明示的に定義すると、引数なしコンストラクタは自動生成されなくなります。

「新しく行を追加したいけれど、どうやってオブジェクトを初期化すればいいか分からない」という状態になり、新規行が消えてしまうため、実務でクラスを拡張した際はまずはじめに疑いたいポイントです。

サンプルコード

実際に AllowUserToAddRows の挙動を画面上で切り替えて確認できる、C#のサンプルコードです。ボタンを押すことで、新規追加行の表示・非表示が切り替わります。

C#
using System.ComponentModel;
namespace DataGridView_AddNewRow
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.btnToggle.Text = "新規追加行を非表示にする";
this.btnToggle.Click += BtnToggle_Click;
SetupSampleData();
}
private void BtnToggle_Click(object? sender, EventArgs e)
{
// 現在のプロパティ値を反転させる
dataGridView1.AllowUserToAddRows = !dataGridView1.AllowUserToAddRows;
// ボタンのテキストを変更
if (dataGridView1.AllowUserToAddRows)
{
btnToggle.Text = "新規追加行を非表示にする";
}
else
{
btnToggle.Text = "新規追加行を表示する";
}
}
private void SetupSampleData()
{
// サンプル用のデータテーブル作成
BindingList<Product> products = new BindingList<Product>
{
new Product { ID = 1, Name = "リンゴ", Price = 150 },
new Product { ID = 2, Name = "バナナ", Price = 100 },
new Product { ID = 3, Name = "メロン", Price = 800 }
};
// DataGridViewにデータをバインド
dataGridView1.DataSource = products;
}
}
// サンプルデータ用のクラス
public class Product
{
public int ID { get; set; }
public string Name { get; set; }
public int Price { get; set; }
// 【ポイント】
// 他に引数付きコンストラクタを定義しない場合は、この記述を省略しても
// コンパイラが自動生成するため動作します。
// もし実務で「引数付きコンストラクタ」を定義する場合は、
// 明示的にこの引数なしコンストラクタも書いておかないと新規行が表示されなくなります。
public Product() { }
}
}

DataGridView_AddNewRow.zip

※ サンプルアプリケーションは、.NET 9 をターゲットとしています。

まとめ

DataGridView の最下行にある新規追加行の制御方法のまとめです。

  • 非表示にする場合: AllowUserToAddRows = false;
  • 表示にする場合: AllowUserToAddRows = true; (デフォルト)
  • 思った通りに動かない時: ReadOnly プロパティや、データソース側の AllowNew 設定、カスタムクラスのコンストラクタ(引数なし)の有無を確認する。

今回の記事が参考になりましたら幸いです。


💬 コメント