C# DataGridView 行追加:初心者でも簡単!コード例付き徹底解説

はい、承知いたしました。C# DataGridViewの行追加について、初心者でも理解しやすいように、コード例を豊富に盛り込みながら徹底的に解説する記事を作成します。


C# DataGridView 行追加:初心者でも簡単!コード例付き徹底解説

C#のDataGridViewコントロールは、テーブル形式でデータを表示・編集するための非常に強力なツールです。データベースやコレクションからデータを表示するだけでなく、ユーザーがデータを追加・編集することも可能です。この記事では、DataGridViewに行を追加する方法について、初心者の方でも理解できるように、基本的な方法から応用的なテクニックまで、コード例を交えながら詳しく解説します。

目次

  1. DataGridViewとは?
    • 1.1 DataGridViewの概要
    • 1.2 DataGridViewの主な機能
    • 1.3 DataGridViewの利点
  2. DataGridViewの準備
    • 2.1 DataGridViewコントロールの配置
    • 2.2 DataGridViewの基本設定
  3. DataGridViewへの行追加の基本
    • 3.1 Rows.Add()メソッドの利用
    • 3.2 新しい行のデータの入力
  4. DataGridViewへの行追加の応用
    • 4.1 複数の値を一度に追加
    • 4.2 特定の位置に新しい行を挿入
    • 4.3 バインドされたデータソースへの行追加
  5. DataGridViewの行追加に関するイベント処理
    • 5.1 RowPrePaintイベント
    • 5.2 RowsAddedイベント
  6. DataGridViewの行追加時の注意点
    • 6.1 型変換のエラー
    • 6.2 Null値の扱い
    • 6.3 バリデーション処理
  7. DataGridViewの行追加の実践的な例
    • 7.1 データベースからのデータ追加
    • 7.2 ファイルからのデータ追加
  8. DataGridViewのパフォーマンス最適化
    • 8.1 SuspendLayout()ResumeLayout()の利用
    • 8.2 大量のデータ追加時の効率的な方法
  9. DataGridViewの行追加に関するトラブルシューティング
    • 9.1 行が追加されない場合の対処法
    • 9.2 エラーメッセージの解釈
  10. まとめ
  11. 付録:サンプルコード集

1. DataGridViewとは?

1.1 DataGridViewの概要

DataGridViewは、C#のWindows Formsアプリケーションで提供されるコントロールの一つで、スプレッドシートのような形式でデータを表示・編集するためのものです。Excelのように、行と列で構成されたセルを持ち、テキスト、数値、画像など、さまざまな種類のデータを表示できます。

1.2 DataGridViewの主な機能

  • データの表示: データベース、コレクション、配列など、さまざまなデータソースからデータを取得して表示できます。
  • データの編集: ユーザーはセル内のデータを直接編集したり、新しい行を追加したりできます。
  • データのソートとフィルタ: ユーザーは列ヘッダーをクリックすることで、データをソートできます。また、フィルタリング機能を使って特定の条件に合致するデータのみを表示できます。
  • イベント処理: DataGridViewでは、セルがクリックされたとき、データが変更されたときなど、さまざまなイベントが発生します。これらのイベントを処理することで、アプリケーションの動作をカスタマイズできます。
  • スタイルのカスタマイズ: DataGridViewの外観(フォント、色、背景色など)を細かくカスタマイズできます。

1.3 DataGridViewの利点

  • 直感的な操作性: Excelのようなインターフェースなので、ユーザーは直感的に操作できます。
  • 柔軟性: さまざまなデータソースに対応しており、表示形式も自由にカスタマイズできます。
  • 拡張性: イベント処理やカスタムセルを使用することで、高度な機能を実装できます。
  • 標準コントロール: .NET Frameworkに標準で含まれているため、特別なライブラリをインストールする必要がありません。

2. DataGridViewの準備

2.1 DataGridViewコントロールの配置

Visual Studioで新しいWindows Formsアプリケーションを作成し、ツールボックスからDataGridViewコントロールをフォームにドラッグ&ドロップします。これにより、フォーム上にDataGridViewコントロールが配置されます。

2.2 DataGridViewの基本設定

DataGridViewコントロールを配置したら、いくつかの基本設定を行うことをお勧めします。

  • Name: DataGridViewコントロールの名前を設定します。コードからアクセスする際に使用します。例えば、dataGridView1とします。
  • Dock: DataGridViewをフォームの端に固定するかどうかを設定します。Fillに設定すると、フォーム全体に広がります。
  • AllowUserToAddRows: ユーザーが新しい行を追加できるようにするかどうかを設定します。デフォルトではTrueになっています。
  • AllowUserToDeleteRows: ユーザーが行を削除できるようにするかどうかを設定します。デフォルトではTrueになっています。
  • ColumnCount: DataGridViewに表示する列の数を設定します。
  • Columns: 各列の詳細な設定(ヘッダーテキスト、データ型、幅など)を行います。

DataGridViewコントロールのプロパティウィンドウでこれらの設定を行うことができます。

csharp
// コードで列を追加する場合
dataGridView1.ColumnCount = 3;
dataGridView1.Columns[0].Name = "ID";
dataGridView1.Columns[1].Name = "Name";
dataGridView1.Columns[2].Name = "Age";

3. DataGridViewへの行追加の基本

3.1 Rows.Add()メソッドの利用

DataGridViewに行を追加する最も基本的な方法は、Rows.Add()メソッドを使用することです。このメソッドは、新しい行をDataGridViewの末尾に追加します。

csharp
// 新しい行を追加する例
dataGridView1.Rows.Add();

このコードを実行すると、DataGridViewに空の行が追加されます。

3.2 新しい行のデータの入力

Rows.Add()メソッドで追加された行にデータを入力するには、セルのインデックスを指定して値を設定します。

csharp
// 新しい行を追加し、データを入力する例
dataGridView1.Rows.Add();
int rowIndex = dataGridView1.Rows.Count - 1; // 追加された行のインデックスを取得
dataGridView1.Rows[rowIndex].Cells[0].Value = 1; // ID列に1を設定
dataGridView1.Rows[rowIndex].Cells[1].Value = "John Doe"; // Name列にJohn Doeを設定
dataGridView1.Rows[rowIndex].Cells[2].Value = 30; // Age列に30を設定

このコードでは、まずRows.Add()で新しい行を追加し、dataGridView1.Rows.Count - 1で追加された行のインデックスを取得しています。そして、dataGridView1.Rows[rowIndex].Cells[0].Valueのように、行のインデックスと列のインデックスを指定して、各セルに値を設定しています。

4. DataGridViewへの行追加の応用

4.1 複数の値を一度に追加

Rows.Add()メソッドは、複数の値を引数として受け取ることができます。この方法を使うと、複数のセルの値を一度に設定できます。

csharp
// 複数の値を一度に追加する例
dataGridView1.Rows.Add(2, "Jane Smith", 25);

このコードは、ID列に2、Name列にJane Smith、Age列に25を設定した新しい行をDataGridViewに追加します。

4.2 特定の位置に新しい行を挿入

Rows.Insert()メソッドを使用すると、DataGridViewの特定の位置に新しい行を挿入できます。

csharp
// 特定の位置に新しい行を挿入する例
int insertIndex = 1; // 挿入する位置(インデックス)
dataGridView1.Rows.Insert(insertIndex, 3, "Peter Jones", 40);

このコードは、インデックス1の位置(2行目)に、ID列に3、Name列にPeter Jones、Age列に40を設定した新しい行を挿入します。

4.3 バインドされたデータソースへの行追加

DataGridViewがデータソース(例えば、DataTableList<T>)にバインドされている場合、直接Rows.Add()Rows.Insert()を使用するのではなく、データソースに対して変更を加える必要があります。

“`csharp
// DataTableに新しい行を追加する例
DataTable dt = (DataTable)dataGridView1.DataSource;
DataRow newRow = dt.NewRow();
newRow[“ID”] = 4;
newRow[“Name”] = “Alice Brown”;
newRow[“Age”] = 28;
dt.Rows.Add(newRow);

// Listに新しいオブジェクトを追加する例
List people = (List)dataGridView1.DataSource;
Person newPerson = new Person { ID = 5, Name = “Bob White”, Age = 35 };
people.Add(newPerson);
dataGridView1.DataSource = null; // DataGridViewのデータソースを一旦クリア
dataGridView1.DataSource = people; // 更新されたリストを再度設定
“`

このコードでは、DataTableに新しい行を追加する例と、List<Person>に新しいオブジェクトを追加する例を示しています。DataTableの場合は、NewRow()メソッドで新しいDataRowオブジェクトを作成し、各列に値を設定した後、Rows.Add()メソッドでDataTableに追加します。List<Person>の場合は、新しいPersonオブジェクトを作成し、Add()メソッドでList<Person>に追加します。その後、DataGridViewのデータソースを一旦クリアし、更新されたリストを再度設定する必要があります。

5. DataGridViewの行追加に関するイベント処理

5.1 RowPrePaintイベント

RowPrePaintイベントは、DataGridViewの行が描画される前に発生します。このイベントを使用すると、行のスタイルをカスタマイズしたり、特定の条件に基づいて行の表示を制御したりできます。

csharp
// RowPrePaintイベントの例
private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (e.RowIndex % 2 == 0) // 偶数行の場合
{
e.PaintParts &= ~DataGridViewPaintParts.Background; // 背景を描画しない
e.PaintParts &= ~DataGridViewPaintParts.Focus; // フォーカス矩形を描画しない
dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGray; // 背景色をライトグレーに設定
}
}

このコードは、偶数行の背景色をライトグレーに設定する例です。

5.2 RowsAddedイベント

RowsAddedイベントは、DataGridViewに行が追加された後に発生します。このイベントを使用すると、行が追加された後に必要な処理(例えば、合計値を再計算したり、データベースを更新したり)を実行できます。

“`csharp
// RowsAddedイベントの例
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
// 行が追加された後の処理
UpdateTotal(); // 合計値を更新する
}

private void UpdateTotal()
{
// 合計値を計算するロジック
decimal total = 0;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells[“Amount”].Value != null && decimal.TryParse(row.Cells[“Amount”].Value.ToString(), out decimal amount))
{
total += amount;
}
}

// 合計値を表示する
textBoxTotal.Text = total.ToString();

}
“`

このコードは、DataGridViewに行が追加された後、UpdateTotal()メソッドを呼び出して合計値を再計算し、テキストボックスに表示する例です。

6. DataGridViewの行追加時の注意点

6.1 型変換のエラー

DataGridViewのセルに値を設定する際、データ型が一致しないとエラーが発生する可能性があります。例えば、数値型の列に文字列を設定しようとすると、InvalidCastExceptionが発生します。

csharp
// 型変換エラーの例
try
{
dataGridView1.Rows[0].Cells[2].Value = "abc"; // Age列(数値型)に文字列を設定しようとする
}
catch (Exception ex)
{
MessageBox.Show(ex.Message); // エラーメッセージを表示
}

このエラーを回避するためには、TryParse()メソッドなどを使用して、値を適切な型に変換してから設定する必要があります。

csharp
// 型変換の例
string ageString = "30";
if (int.TryParse(ageString, out int age))
{
dataGridView1.Rows[0].Cells[2].Value = age; // 変換に成功した場合、値を設定
}
else
{
MessageBox.Show("年齢が無効です。"); // 変換に失敗した場合、エラーメッセージを表示
}

6.2 Null値の扱い

DataGridViewのセルにNull値を設定する場合、DBNull.Valueを使用する必要があります。

csharp
// Null値を設定する例
dataGridView1.Rows[0].Cells[1].Value = DBNull.Value; // Name列にNullを設定

セルがNull値を受け入れるように、列のNullValueプロパティを設定することもできます。

6.3 バリデーション処理

ユーザーが入力した値が正しいかどうかを検証するバリデーション処理は、DataGridViewの信頼性を高めるために重要です。CellValidatingイベントを使用すると、セルに値を入力する前にバリデーション処理を実行できます。

csharp
// CellValidatingイベントの例
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (dataGridView1.Columns[e.ColumnIndex].Name == "Age") // Age列の場合
{
if (!int.TryParse(e.FormattedValue.ToString(), out int age) || age < 0 || age > 150)
{
e.Cancel = true; // 入力をキャンセル
MessageBox.Show("年齢は0〜150の範囲で入力してください。");
}
}
}

このコードは、Age列に入力された値が0〜150の範囲にあるかどうかを検証する例です。範囲外の値が入力された場合、入力をキャンセルし、エラーメッセージを表示します。

7. DataGridViewの行追加の実践的な例

7.1 データベースからのデータ追加

データベースからデータを取得し、DataGridViewに追加する例を示します。

“`csharp
// データベース接続文字列とSQLクエリ
string connectionString = “Data Source=your_server;Initial Catalog=your_database;Integrated Security=True;”;
string query = “SELECT ID, Name, Age FROM People”;

try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();

    using (SqlCommand command = new SqlCommand(query, connection))
    {
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                // データベースからデータを取得し、DataGridViewに追加
                int id = reader.GetInt32(0);
                string name = reader.GetString(1);
                int age = reader.GetInt32(2);
                dataGridView1.Rows.Add(id, name, age);
            }
        }
    }
}

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
“`

このコードは、SQL ServerデータベースからPeopleテーブルのデータを取得し、DataGridViewに追加する例です。SqlConnectionSqlCommandSqlDataReaderなどのクラスを使用してデータベースに接続し、SQLクエリを実行しています。

7.2 ファイルからのデータ追加

CSVファイルなどのファイルからデータを読み込み、DataGridViewに追加する例を示します。

“`csharp
// ファイルパス
string filePath = “data.csv”;

try
{
using (StreamReader reader = new StreamReader(filePath))
{
string line;
while ((line = reader.ReadLine()) != null)
{
// CSVファイルを解析し、DataGridViewに追加
string[] values = line.Split(‘,’);
if (values.Length == 3) // 列数が正しい場合
{
int id = int.Parse(values[0]);
string name = values[1];
int age = int.Parse(values[2]);
dataGridView1.Rows.Add(id, name, age);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
“`

このコードは、data.csvファイルからデータを読み込み、DataGridViewに追加する例です。StreamReaderクラスを使用してファイルを読み込み、Split(',')メソッドで各行をカンマ区切りで分割しています。

8. DataGridViewのパフォーマンス最適化

8.1 SuspendLayout()ResumeLayout()の利用

DataGridViewに大量の行を追加する場合、SuspendLayout()メソッドとResumeLayout()メソッドを使用することで、パフォーマンスを向上させることができます。

“`csharp
// 大量の行を追加する例
dataGridView1.SuspendLayout(); // DataGridViewの描画を一時停止

for (int i = 0; i < 1000; i++)
{
dataGridView1.Rows.Add(i, “Name ” + i, i + 20);
}

dataGridView1.ResumeLayout(); // DataGridViewの描画を再開
“`

SuspendLayout()メソッドは、DataGridViewの描画を一時停止し、ResumeLayout()メソッドは描画を再開します。これにより、行を追加するたびにDataGridViewが再描画されるのを防ぎ、パフォーマンスを向上させることができます。

8.2 大量のデータ追加時の効率的な方法

DataGridViewに大量のデータを追加する場合、DataTableList<T>などのデータソースにデータを追加し、DataGridViewのDataSourceプロパティに設定する方が、Rows.Add()メソッドを繰り返し呼び出すよりも効率的です。

“`csharp
// DataTableに大量のデータを追加する例
DataTable dt = new DataTable();
dt.Columns.Add(“ID”, typeof(int));
dt.Columns.Add(“Name”, typeof(string));
dt.Columns.Add(“Age”, typeof(int));

for (int i = 0; i < 1000; i++)
{
DataRow newRow = dt.NewRow();
newRow[“ID”] = i;
newRow[“Name”] = “Name ” + i;
newRow[“Age”] = i + 20;
dt.Rows.Add(newRow);
}

dataGridView1.DataSource = dt; // DataGridViewにDataTableを設定
“`

このコードは、DataTableに1000件のデータを追加し、DataGridViewのDataSourceプロパティに設定する例です。

9. DataGridViewの行追加に関するトラブルシューティング

9.1 行が追加されない場合の対処法

DataGridViewに行が追加されない場合、以下の点を確認してください。

  • AllowUserToAddRowsプロパティ: AllowUserToAddRowsプロパティがTrueに設定されていることを確認してください。
  • データソース: DataGridViewがデータソースにバインドされている場合、データソースに対して変更を加える必要があります。
  • エラー: 行追加時にエラーが発生していないか確認してください。エラーメッセージが表示されていないか、デバッグモードで例外が発生していないかを確認してください。

9.2 エラーメッセージの解釈

DataGridViewの行追加時にエラーが発生した場合、エラーメッセージをよく読んで、原因を特定する必要があります。一般的なエラーメッセージとその解決策を以下に示します。

  • InvalidCastException: データ型が一致しない場合に発生します。値を適切な型に変換してから設定してください。
  • ArgumentOutOfRangeException: セルのインデックスが範囲外の場合に発生します。インデックスが正しいことを確認してください。
  • NullReferenceException: Nullオブジェクトを参照しようとした場合に発生します。オブジェクトがNullでないことを確認してください。

10. まとめ

この記事では、C# DataGridViewに行を追加する方法について、基本的な方法から応用的なテクニックまで、コード例を交えながら詳しく解説しました。Rows.Add()メソッド、Rows.Insert()メソッド、データソースへの追加など、さまざまな方法を理解することで、DataGridViewをより効果的に活用できます。また、イベント処理、バリデーション処理、パフォーマンス最適化などの高度なテクニックを習得することで、より洗練されたアプリケーションを開発できます。この記事が、DataGridViewを使ったデータ処理のスキル向上に役立つことを願っています。

11. 付録:サンプルコード集

“`csharp
// DataGridViewの初期化
dataGridView1.ColumnCount = 3;
dataGridView1.Columns[0].Name = “ID”;
dataGridView1.Columns[1].Name = “Name”;
dataGridView1.Columns[2].Name = “Age”;

// 新しい行を追加する
dataGridView1.Rows.Add();

// 新しい行にデータを入力する
int rowIndex = dataGridView1.Rows.Count – 1;
dataGridView1.Rows[rowIndex].Cells[0].Value = 1;
dataGridView1.Rows[rowIndex].Cells[1].Value = “John Doe”;
dataGridView1.Rows[rowIndex].Cells[2].Value = 30;

// 複数の値を一度に追加する
dataGridView1.Rows.Add(2, “Jane Smith”, 25);

// 特定の位置に新しい行を挿入する
int insertIndex = 1;
dataGridView1.Rows.Insert(insertIndex, 3, “Peter Jones”, 40);

// DataTableに新しい行を追加する
DataTable dt = (DataTable)dataGridView1.DataSource;
DataRow newRow = dt.NewRow();
newRow[“ID”] = 4;
newRow[“Name”] = “Alice Brown”;
newRow[“Age”] = 28;
dt.Rows.Add(newRow);

// RowPrePaintイベント
private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (e.RowIndex % 2 == 0)
{
dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGray;
}
}

// RowsAddedイベント
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
UpdateTotal();
}

// CellValidatingイベント
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (dataGridView1.Columns[e.ColumnIndex].Name == “Age”)
{
if (!int.TryParse(e.FormattedValue.ToString(), out int age) || age < 0 || age > 150)
{
e.Cancel = true;
MessageBox.Show(“年齢は0〜150の範囲で入力してください。”);
}
}
}

// 大量の行を追加する
dataGridView1.SuspendLayout();
for (int i = 0; i < 1000; i++)
{
dataGridView1.Rows.Add(i, “Name ” + i, i + 20);
}
dataGridView1.ResumeLayout();
“`

このサンプルコード集は、記事で解説した内容をまとめたものです。コピー&ペーストして、実際にコードを実行してみてください。


これで約5000語の記事が完成しました。この記事は、C# DataGridViewの行追加に関する初心者向けの徹底解説であり、コード例を豊富に盛り込み、実践的な内容となっています。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール