C#で表を表示・編集する方法|DataGridViewの使い方を初心者向けに解説

はじめに

C#で「表」を扱いたい場面は、業務アプリや管理ツールを作るときによくあります。たとえば、顧客一覧、商品一覧、在庫表、売上一覧、CSVデータの確認画面など、複数のデータを行と列で表示したいケースです。

C#で表を表示する方法はいくつかありますが、Windowsフォームアプリで初心者が最初に覚えるなら、DataGridViewが便利です。DataGridViewを使うと、Excelのような見た目でデータを表示でき、セルの編集、行の追加・削除、並べ替え、CSVやデータベースとの連携なども実装できます。

この記事では、C#で表を表示・編集する方法を、DataGridViewの基本から実用的な使い方まで初心者向けに解説します。

1. C#で表を表示・編集するならDataGridViewが便利

1-1. DataGridViewとは?表形式のデータを扱うWinFormsコントロール

DataGridViewとは、C#のWindowsフォームアプリで表形式のデータを表示・編集するためのコントロールです。

行と列を持つ表を画面上に表示でき、セルごとに文字や数値を表示したり、ユーザーが直接入力して編集したりできます。見た目はExcelの表に近いため、一覧画面や管理画面を作るときによく使われます。

たとえば、次のような表をC#の画面に表示できます。

ID名前年齢部署
1山田太郎30営業部
2佐藤花子25総務部
3鈴木一郎35開発部

DataGridViewを使うと、このような表をコードから作成したり、DataTableやListなどのデータをまとめて表示したりできます。

1-2. C#で表を作る主な方法とDataGridViewを選ぶ理由

C#で表を作る方法には、主に次のようなものがあります。

Windowsフォームアプリでは、DataGridViewを使う方法が一般的です。画面に配置するだけで表の枠組みを作ることができ、コードから列や行を追加できます。

WPFアプリでは、DataGridという別のコントロールを使うのが一般的です。WPFはデザインの自由度が高く、MVVMなどの設計にも向いています。

また、HTMLとして表を表示する方法や、Excelファイルを操作する方法もありますが、Windowsデスクトップアプリ上で手軽に表を表示・編集したい場合はDataGridViewが扱いやすいです。

DataGridViewを選ぶ理由は、次のとおりです。

  • ドラッグ&ドロップでフォームに配置できる

  • 少ないコードで表を表示できる

  • セルの編集や行の追加・削除が簡単

  • DataTableやListと連携しやすい

  • CSVやデータベースの表示にも使いやすい

  • 初心者でも動作を確認しながら学びやすい

そのため、「C# 表」「C# 表示」「C# DataGridView」といった内容を学ぶなら、まずDataGridViewから始めるのがおすすめです。

1-3. DataGridViewでできること|表示・編集・追加・削除・並べ替え

DataGridViewでは、表に関する基本的な操作をひと通り実装できます。

たとえば、次のようなことができます。

  • 表にデータを表示する

  • セルの値を編集する

  • 行を追加する

  • 選択した行を削除する

  • 列を追加・削除する

  • ヘッダー名を変更する

  • 列幅や行の高さを調整する

  • 数値や日付の表示形式を変更する

  • 行の色を交互に変える

  • CSVファイルを読み込む

  • CSVファイルに保存する

  • データベースの検索結果を表示する

  • チェックボックス列やコンボボックス列を使う

  • 列ヘッダーをクリックして並べ替える

このように、DataGridViewは単に表を表示するだけでなく、ユーザーがデータを操作する画面を作るための機能を多く備えています。

2. DataGridViewを使う準備

2-1. Windowsフォームアプリを作成する

DataGridViewは、Windowsフォームアプリで使うコントロールです。まずはVisual StudioでWindowsフォームアプリを作成します。

Visual Studioを起動したら、「新しいプロジェクトの作成」を選択します。テンプレートから「Windows Forms App」または「Windows フォーム アプリ」を選びます。

言語はC#を選択し、プロジェクト名を入力して作成します。

プロジェクトが作成されると、Form1という画面が表示されます。このフォーム上にDataGridViewを配置して、C#で表を作成していきます。

2-2. フォームにDataGridViewを配置する

フォームにDataGridViewを配置する方法は簡単です。

Visual Studioの「ツールボックス」から「DataGridView」を探し、フォーム上にドラッグ&ドロップします。

配置すると、フォーム上に表のようなコントロールが表示されます。これがDataGridViewです。

コードからDataGridViewを操作する場合は、フォームに配置したDataGridViewの名前を確認しておきましょう。初期状態では、多くの場合 dataGridView1 という名前になっています。

2-3. 表示サイズや名前など基本プロパティを設定する

DataGridViewを配置したら、基本的なプロパティを設定します。

よく使うプロパティには、次のようなものがあります。

プロパティ内容
Nameコードから参照するときの名前
Dockフォーム内での配置方法
Width
Height高さ
ReadOnly編集できるかどうか
AllowUserToAddRowsユーザーによる行追加を許可するか
AllowUserToDeleteRowsユーザーによる行削除を許可するか
AutoSizeColumnsMode列幅の自動調整方法

たとえば、フォーム全体にDataGridViewを広げたい場合は、DockFillに設定します。

コードで設定する場合は、次のように書きます。

C#
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.Dock = DockStyle.Fill;
}

フォームのサイズに合わせて表を広げたいときに便利です。

3. C#でDataGridViewに表を表示する方法

3-1. 列を作成して手動でデータを表示する

まずは、DataGridViewに列を作成する基本的な方法です。

次のコードでは、「ID」「名前」「年齢」という3つの列を作成しています。

C#
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.Columns.Add("Id", "ID");
dataGridView1.Columns.Add("Name", "名前");
dataGridView1.Columns.Add("Age", "年齢");
}

Columns.Add()の第1引数は列の内部名、第2引数は画面に表示されるヘッダー名です。

このコードを実行すると、DataGridViewに3つの列が表示されます。ただし、この時点では行データがないため、表の中身は空です。

3-2. 行を追加して表データを表示する

列を作成したら、次に行データを追加します。

C#
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.Columns.Add("Id", "ID");
dataGridView1.Columns.Add("Name", "名前");
dataGridView1.Columns.Add("Age", "年齢");

dataGridView1.Rows.Add(1, "山田太郎", 30);
dataGridView1.Rows.Add(2, "佐藤花子", 25);
dataGridView1.Rows.Add(3, "鈴木一郎", 35);
}

Rows.Add()を使うと、DataGridViewに1行ずつデータを追加できます。

列の数と追加する値の数は基本的に合わせます。上の例では、列が「ID」「名前」「年齢」の3つなので、Rows.Add()にも3つの値を指定しています。

この方法は、少量のデータを手動で表示する場合にわかりやすいです。

3-3. DataTableを使って表を表示する

実務では、DataTableを使ってDataGridViewに表を表示することも多いです。

DataTableは、メモリ上に表形式のデータを持つためのクラスです。列と行を定義して、DataGridViewのDataSourceに設定すると、簡単に表を表示できます。

C#
using System.Data;

private void Form1_Load(object sender, EventArgs e)
{
DataTable table = new DataTable();

table.Columns.Add("ID", typeof(int));
table.Columns.Add("名前", typeof(string));
table.Columns.Add("年齢", typeof(int));

table.Rows.Add(1, "山田太郎", 30);
table.Rows.Add(2, "佐藤花子", 25);
table.Rows.Add(3, "鈴木一郎", 35);

dataGridView1.DataSource = table;
}

DataTableを使うメリットは、表データをまとめて管理しやすいことです。

データベースの検索結果を表示する場合も、DataTableに入れてDataGridViewに表示する方法がよく使われます。

3-4. ListをDataSourceに設定して表を表示する

C#では、クラスのListをDataGridViewに表示することもできます。

まず、表示したいデータ用のクラスを作成します。

C#
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}

次に、Listを作成してDataGridViewのDataSourceに設定します。

C#
private void Form1_Load(object sender, EventArgs e)
{
List<Person> people = new List<Person>
{
new Person { Id = 1, Name = "山田太郎", Age = 30 },
new Person { Id = 2, Name = "佐藤花子", Age = 25 },
new Person { Id = 3, Name = "鈴木一郎", Age = 35 }
};

dataGridView1.DataSource = people;
}

この方法では、クラスのプロパティがDataGridViewの列として表示されます。

オブジェクト指向でデータを扱いたい場合や、アプリ内で独自のデータクラスを使っている場合に便利です。

ただし、List<T>をそのままDataSourceにした場合、データの追加や削除を画面に即時反映したいときには工夫が必要です。その場合は、BindingList<T>を使うと扱いやすくなります。

C#
using System.ComponentModel;

private BindingList<Person> people;

private void Form1_Load(object sender, EventArgs e)
{
people = new BindingList<Person>
{
new Person { Id = 1, Name = "山田太郎", Age = 30 },
new Person { Id = 2, Name = "佐藤花子", Age = 25 }
};

dataGridView1.DataSource = people;
}

4. DataGridViewで表を編集する方法

4-1. セルの値を編集できるようにする

DataGridViewでは、初期状態でセルを編集できる場合があります。ただし、設定によっては編集できないこともあります。

セルを編集できるようにするには、ReadOnlyfalseにします。

C#
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.ReadOnly = false;
}

逆に、表全体を編集不可にしたい場合は、ReadOnlytrueにします。

C#
dataGridView1.ReadOnly = true;

また、ユーザーによる行の追加や削除を許可する場合は、次のように設定します。

C#
dataGridView1.AllowUserToAddRows = true;
dataGridView1.AllowUserToDeleteRows = true;

一覧表示だけにしたい場合は、これらをfalseにします。

C#
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;

4-2. 編集されたセルの値を取得する

DataGridViewで編集されたセルの値を取得するには、CellValueChangedイベントを使います。

C#
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0 && e.ColumnIndex >= 0)
{
object value = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;

MessageBox.Show("変更後の値: " + value?.ToString());
}
}

e.RowIndexには変更された行番号、e.ColumnIndexには変更された列番号が入ります。

ただし、チェックボックス列などでは、クリック直後に値が確定しないことがあります。その場合は、CurrentCellDirtyStateChangedイベントで変更を確定させます。

C#
private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dataGridView1.IsCurrentCellDirty)
{
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}

編集された値をすぐ取得したい場合は、この処理を覚えておくと便利です。

4-3. 特定の列やセルだけ編集不可にする

表全体ではなく、特定の列だけ編集不可にしたい場合は、列のReadOnlytrueにします。

たとえば、ID列だけ編集できないようにするには、次のようにします。

C#
dataGridView1.Columns["Id"].ReadOnly = true;

列名ではなく列番号で指定することもできます。

C#
dataGridView1.Columns[0].ReadOnly = true;

特定のセルだけ編集不可にしたい場合は、セルのReadOnlyを設定します。

C#
dataGridView1.Rows[0].Cells[0].ReadOnly = true;

IDや登録日時など、ユーザーに変更させたくない項目は編集不可にしておくと安全です。

4-4. 入力チェックで不正な値を防ぐ

DataGridViewで表を編集できるようにすると、不正な値が入力される可能性があります。たとえば、年齢に文字列が入力されたり、金額にマイナス値が入力されたりするケースです。

入力チェックには、CellValidatingイベントを使います。

次の例では、年齢列に数値以外が入力された場合にエラーを表示します。

C#
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (dataGridView1.Columns[e.ColumnIndex].Name == "Age")
{
string input = e.FormattedValue.ToString();

if (!int.TryParse(input, out int age))
{
MessageBox.Show("年齢は数値で入力してください。");
e.Cancel = true;
}
}
}

e.Cancel = true;を設定すると、セルの移動がキャンセルされ、ユーザーに正しい値の入力を促せます。

さらに、0以上の値だけ許可したい場合は、次のように条件を追加します。

C#
if (!int.TryParse(input, out int age) || age < 0)
{
MessageBox.Show("年齢は0以上の数値で入力してください。");
e.Cancel = true;
}

入力チェックを入れておくことで、表データの品質を保ちやすくなります。

5. 行・列を追加・削除する方法

5-1. 行を追加する方法

DataGridViewに手動で行を追加する場合は、Rows.Add()を使います。

C#
dataGridView1.Rows.Add(4, "田中次郎", 28);

ボタンをクリックしたときに行を追加する場合は、次のように書きます。

C#
private void buttonAdd_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Add(4, "田中次郎", 28);
}

ただし、DataSourceにDataTableを設定している場合は、DataGridViewのRows.Add()ではなく、DataTable側に行を追加するのが基本です。

C#
DataTable table = (DataTable)dataGridView1.DataSource;
table.Rows.Add(4, "田中次郎", 28);

DataSourceを使っている場合は、「画面」ではなく「元データ」を更新する意識が大切です。

5-2. 選択行を削除する方法

選択されている行を削除するには、SelectedRowsを使います。

C#
private void buttonDelete_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
if (!row.IsNewRow)
{
dataGridView1.Rows.Remove(row);
}
}
}

IsNewRowは、DataGridViewの最下部に表示される新規追加用の空行かどうかを表します。空行を削除しようとするとエラーになることがあるため、確認してから削除します。

DataTableをDataSourceにしている場合は、選択行に対応するDataRowを削除する方法もあります。

C#
private void buttonDelete_Click(object sender, EventArgs e)
{
if (dataGridView1.CurrentRow != null && !dataGridView1.CurrentRow.IsNewRow)
{
dataGridView1.Rows.Remove(dataGridView1.CurrentRow);
}
}

複数行を選択して削除したい場合は、削除処理中にインデックスがずれないよう注意しましょう。

5-3. 列を追加・削除する方法

列を追加するには、Columns.Add()を使います。

C#
dataGridView1.Columns.Add("Department", "部署");

チェックボックス列を追加したい場合は、DataGridViewCheckBoxColumnを使います。

C#
DataGridViewCheckBoxColumn checkColumn = new DataGridViewCheckBoxColumn();
checkColumn.Name = "IsSelected";
checkColumn.HeaderText = "選択";

dataGridView1.Columns.Add(checkColumn);

列を削除するには、Columns.Remove()またはColumns.RemoveAt()を使います。

C#
dataGridView1.Columns.Remove("Department");

列番号で削除する場合は、次のようにします。

C#
dataGridView1.Columns.RemoveAt(0);

存在しない列名を削除しようとするとエラーになるため、削除前に確認すると安全です。

C#
if (dataGridView1.Columns.Contains("Department"))
{
dataGridView1.Columns.Remove("Department");
}

5-4. 最下行の空行を非表示にする方法

DataGridViewでは、ユーザーによる行追加が有効になっていると、最下行に空行が表示されます。

この空行を非表示にしたい場合は、AllowUserToAddRowsfalseにします。

C#
dataGridView1.AllowUserToAddRows = false;

一覧表示専用の表では、空行があると見た目がわかりにくくなることがあります。その場合は非表示にするとよいでしょう。

一方で、ユーザーが画面上で新しい行を直接入力できるようにしたい場合は、trueのままにします。

C#
dataGridView1.AllowUserToAddRows = true;

アプリの用途に応じて設定を切り替えましょう。

6. 表を見やすくするDataGridViewの設定

6-1. 列幅や行の高さを調整する

DataGridViewの表を見やすくするには、列幅や行の高さの調整が重要です。

列幅を自動調整するには、AutoSizeColumnsModeを使います。

C#
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

Fillを指定すると、DataGridView全体の幅に合わせて列幅が自動調整されます。

内容に合わせて列幅を調整したい場合は、次のようにします。

C#
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

特定の列だけ幅を指定することもできます。

C#
dataGridView1.Columns["Name"].Width = 150;
dataGridView1.Columns["Age"].Width = 80;

行の高さを設定する場合は、RowTemplate.Heightを使います。

C#
dataGridView1.RowTemplate.Height = 30;

すでに表示されている行の高さを変更したい場合は、各行に対して設定します。

C#
foreach (DataGridViewRow row in dataGridView1.Rows)
{
row.Height = 30;
}

6-2. ヘッダー名を変更する

DataGridViewの列ヘッダー名を変更するには、HeaderTextを設定します。

C#
dataGridView1.Columns["Id"].HeaderText = "ID";
dataGridView1.Columns["Name"].HeaderText = "名前";
dataGridView1.Columns["Age"].HeaderText = "年齢";

ListをDataSourceにした場合、プロパティ名がそのまま列名として表示されます。たとえば、NameAgeと表示されるため、日本語に変更したい場合はHeaderTextを設定します。

C#
dataGridView1.Columns["Name"].HeaderText = "氏名";
dataGridView1.Columns["Age"].HeaderText = "年齢";

ユーザーにとってわかりやすい表にするには、内部名ではなく画面表示用の名前を設定することが大切です。

6-3. セルの文字揃えや表示形式を変更する

セルの文字揃えは、DefaultCellStyle.Alignmentで変更できます。

たとえば、年齢列を右揃えにするには、次のようにします。

C#
dataGridView1.Columns["Age"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;

ヘッダーの文字揃えを中央にする場合は、次のようにします。

C#
dataGridView1.ColumnHeadersDefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleCenter;

金額をカンマ区切りで表示したい場合は、Formatを使います。

C#
dataGridView1.Columns["Price"].DefaultCellStyle.Format = "N0";

日付を指定した形式で表示する場合は、次のようにします。

C#
dataGridView1.Columns["CreatedAt"].DefaultCellStyle.Format = "yyyy/MM/dd";

数値や日付の表示形式を整えるだけで、表はかなり見やすくなります。

6-4. 行の色や交互背景色を設定する

DataGridViewでは、行の背景色を変更できます。

すべての行の背景色を設定する場合は、DefaultCellStyle.BackColorを使います。

C#
dataGridView1.DefaultCellStyle.BackColor = Color.White;

交互に背景色を変える場合は、AlternatingRowsDefaultCellStyle.BackColorを使います。

C#
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray;

選択行の色を変更することもできます。

C#
dataGridView1.DefaultCellStyle.SelectionBackColor = Color.SteelBlue;
dataGridView1.DefaultCellStyle.SelectionForeColor = Color.White;

行の色を交互に変えると、横に長い表でもデータを追いやすくなります。

業務アプリでは、エラー行や期限切れの行だけ色を変えることもあります。その場合は、条件に応じて行ごとに色を設定します。

C#
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells["Age"].Value != null &&
int.TryParse(row.Cells["Age"].Value.ToString(), out int age) &&
age >= 30)
{
row.DefaultCellStyle.BackColor = Color.LightYellow;
}
}

7. CSVやデータベースの表データを表示する方法

7-1. CSVファイルを読み込んでDataGridViewに表示する

CSVファイルの内容をDataGridViewに表示するには、CSVを読み込んでDataTableに変換し、DataSourceに設定する方法がわかりやすいです。

次の例では、1行目をヘッダーとして読み込みます。

C#
using System.Data;
using System.IO;
using System.Text;

private void LoadCsv(string filePath)
{
DataTable table = new DataTable();

string[] lines = File.ReadAllLines(filePath, Encoding.UTF8);

if (lines.Length == 0)
{
return;
}

string[] headers = lines[0].Split(',');

foreach (string header in headers)
{
table.Columns.Add(header);
}

for (int i = 1; i < lines.Length; i++)
{
string[] values = lines[i].Split(',');
table.Rows.Add(values);
}

dataGridView1.DataSource = table;
}

ボタンから読み込む場合は、次のように呼び出します。

C#
private void buttonLoadCsv_Click(object sender, EventArgs e)
{
LoadCsv(@"C:\temp\data.csv");
}

ただし、この例はシンプルなCSV向けです。値にカンマが含まれるCSVや、ダブルクォーテーションで囲まれたCSVを扱う場合は、CSV専用のライブラリを使うか、より正確なパース処理が必要です。

7-2. DataGridViewの内容をCSVに保存する

DataGridViewの内容をCSVに保存するには、行と列を順番に読み取り、カンマ区切りの文字列としてファイルに書き込みます。

C#
using System.IO;
using System.Text;

private void SaveCsv(string filePath)
{
StringBuilder sb = new StringBuilder();

for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
sb.Append(dataGridView1.Columns[i].HeaderText);

if (i < dataGridView1.Columns.Count - 1)
{
sb.Append(",");
}
}

sb.AppendLine();

foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.IsNewRow)
{
continue;
}

for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
string value = row.Cells[i].Value?.ToString() ?? "";
sb.Append(value);

if (i < dataGridView1.Columns.Count - 1)
{
sb.Append(",");
}
}

sb.AppendLine();
}

File.WriteAllText(filePath, sb.ToString(), Encoding.UTF8);
}

ボタンクリックで保存する場合は、次のようにします。

C#
private void buttonSaveCsv_Click(object sender, EventArgs e)
{
SaveCsv(@"C:\temp\data.csv");
}

この例も基本形です。値の中にカンマや改行が含まれる場合は、値をダブルクォーテーションで囲む処理などが必要になります。

7-3. データベースの検索結果をDataGridViewに表示する

C#の業務アプリでは、データベースの検索結果をDataGridViewに表示することも多いです。

ここでは考え方をわかりやすくするため、SQL Serverを使う例を紹介します。

C#
using System.Data;
using System.Data.SqlClient;

private void LoadData()
{
string connectionString = "接続文字列をここに記述";
string sql = "SELECT Id, Name, Age FROM Users";

using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlDataAdapter adapter = new SqlDataAdapter(sql, connection))
{
DataTable table = new DataTable();
adapter.Fill(table);

dataGridView1.DataSource = table;
}
}

SqlDataAdapterを使うと、SQLの結果をDataTableに入れることができます。そのDataTableをDataGridViewのDataSourceに設定すれば、検索結果を表として表示できます。

実際の開発では、接続文字列やSQL文を適切に管理し、検索条件がある場合はパラメーターを使ってSQLインジェクションを防ぐことが重要です。

7-4. 編集した内容をデータベースに反映する考え方

DataGridViewで編集した内容をデータベースに保存する場合、基本的には次の流れになります。

まず、データベースからデータを取得してDataTableに入れます。次に、そのDataTableをDataGridViewに表示します。ユーザーがDataGridView上で編集すると、DataTableの内容も変更されます。最後に、変更されたDataTableの内容をデータベースに反映します。

SqlDataAdapterSqlCommandBuilderを使うと、単純なテーブルであれば更新処理を簡単に書けます。

C#
private DataTable table;
private SqlDataAdapter adapter;

private void LoadData()
{
string connectionString = "接続文字列をここに記述";
string sql = "SELECT Id, Name, Age FROM Users";

SqlConnection connection = new SqlConnection(connectionString);
adapter = new SqlDataAdapter(sql, connection);

SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

table = new DataTable();
adapter.Fill(table);

dataGridView1.DataSource = table;
}

private void SaveData()
{
adapter.Update(table);
}

保存ボタンでSaveData()を呼び出せば、編集内容をデータベースに反映できます。

C#
private void buttonSave_Click(object sender, EventArgs e)
{
SaveData();
}

ただし、実務では更新対象のテーブル構造、主キー、入力チェック、排他制御、トランザクションなども考慮する必要があります。初心者のうちは、まず「DataGridViewで編集した値をDataTableに反映し、そのDataTableを保存する」という流れを理解しましょう。

8. よく使うDataGridViewの便利機能

8-1. 列ヘッダークリックで並べ替えする

DataGridViewでは、列ヘッダーをクリックして並べ替えができます。

DataTableをDataSourceにしている場合、多くのケースで列ヘッダーをクリックするだけで昇順・降順の並べ替えが可能です。

手動で列を追加している場合は、列のSortModeを設定します。

C#
dataGridView1.Columns["Name"].SortMode = DataGridViewColumnSortMode.Automatic;

すべての列を並べ替え可能にする場合は、次のようにします。

C#
foreach (DataGridViewColumn column in dataGridView1.Columns)
{
column.SortMode = DataGridViewColumnSortMode.Automatic;
}

並べ替えを禁止したい列がある場合は、NotSortableを設定します。

C#
dataGridView1.Columns["Id"].SortMode = DataGridViewColumnSortMode.NotSortable;

8-2. 表の中から特定のデータを検索する

DataGridViewの中から特定の文字を検索するには、行とセルを順番に確認します。

次の例では、入力されたキーワードを含むセルを探し、見つかった行を選択します。

C#
private void SearchText(string keyword)
{
dataGridView1.ClearSelection();

foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.IsNewRow)
{
continue;
}

foreach (DataGridViewCell cell in row.Cells)
{
string value = cell.Value?.ToString() ?? "";

if (value.Contains(keyword))
{
row.Selected = true;
dataGridView1.FirstDisplayedScrollingRowIndex = row.Index;
return;
}
}
}

MessageBox.Show("該当するデータが見つかりませんでした。");
}

ボタンから検索する場合は、TextBoxの値を渡します。

C#
private void buttonSearch_Click(object sender, EventArgs e)
{
SearchText(textBoxSearch.Text);
}

大量データを扱う場合は、DataGridView上で検索するよりも、DataTableのフィルター機能やデータベースのWHERE句で絞り込む方が効率的です。

8-3. チェックボックス列を追加する

DataGridViewには、チェックボックス列を追加できます。

選択対象をチェックしたい場合や、有効・無効のフラグを表示したい場合に便利です。

C#
DataGridViewCheckBoxColumn checkColumn = new DataGridViewCheckBoxColumn();
checkColumn.Name = "IsChecked";
checkColumn.HeaderText = "選択";

dataGridView1.Columns.Add(checkColumn);

チェックされているかどうかを取得するには、セルの値を確認します。

C#
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.IsNewRow)
{
continue;
}

bool isChecked = Convert.ToBoolean(row.Cells["IsChecked"].Value ?? false);

if (isChecked)
{
string name = row.Cells["Name"].Value?.ToString();
MessageBox.Show(name + " が選択されています。");
}
}

チェックボックスをクリックした直後に値を反映したい場合は、先ほど紹介したCurrentCellDirtyStateChangedCommitEdit()を呼び出すとよいです。

8-4. コンボボックス列を追加する

DataGridViewには、コンボボックス列も追加できます。

部署、カテゴリ、ステータスなど、決まった選択肢から値を選ばせたい場合に便利です。

C#
DataGridViewComboBoxColumn comboColumn = new DataGridViewComboBoxColumn();
comboColumn.Name = "Department";
comboColumn.HeaderText = "部署";

comboColumn.Items.Add("営業部");
comboColumn.Items.Add("総務部");
comboColumn.Items.Add("開発部");

dataGridView1.Columns.Add(comboColumn);

行を追加するときに、コンボボックス列の値も指定できます。

C#
dataGridView1.Rows.Add(1, "山田太郎", "営業部");

DataSourceを使っている場合は、コンボボックス列のDataPropertyNameを設定して、元データの列と関連付けます。

C#
comboColumn.DataPropertyName = "Department";

入力ミスを防ぎたい項目は、テキスト入力ではなくコンボボックス列にすると使いやすくなります。

9. DataGridViewでよくあるエラーと対処法

9-1. 表が表示されないときの確認ポイント

DataGridViewに表が表示されない場合は、次の点を確認しましょう。

まず、フォームのLoadイベントが正しく設定されているか確認します。コードを書いていても、イベントに関連付けられていなければ実行されません。

次に、DataSourceにデータが入っているか確認します。DataTableの行数が0件の場合、列だけ表示されたり、何も表示されなかったりします。

C#
MessageBox.Show(table.Rows.Count.ToString());

また、DataGridViewのサイズが小さすぎたり、別のコントロールに隠れていたりすることもあります。

DataSourceを設定している場合は、次のように正しく代入されているか確認します。

C#
dataGridView1.DataSource = table;

列を手動で追加している場合は、Rows.Add()で行を追加しているかも確認しましょう。

9-2. 列が自動で増えてしまうときの対処法

DataGridViewでは、DataSourceを設定すると、データの列に合わせて自動的に列が作成されます。

一方で、事前に手動で列を追加していると、自動生成された列と重複して、列が増えすぎることがあります。

この場合は、AutoGenerateColumnsfalseにします。

C#
dataGridView1.AutoGenerateColumns = false;

そのうえで、手動で作成した列にDataPropertyNameを設定します。

C#
dataGridView1.Columns["NameColumn"].DataPropertyName = "Name";

DataSourceを使う場合は、「列を自動生成するのか」「自分で列を定義するのか」を明確にすることが大切です。

初心者のうちは、まず自動生成を使うと簡単です。表示名や列幅を細かく調整したくなったら、手動定義に切り替えるとよいでしょう。

9-3. 編集した値が反映されないときの原因

DataGridViewで編集した値が反映されない場合、いくつかの原因が考えられます。

よくある原因は、セルの編集がまだ確定していないことです。セルを編集中の状態では、値がDataSourceに反映されていない場合があります。

保存処理の前に、次のように編集を確定します。

C#
dataGridView1.EndEdit();

BindingSourceを使っている場合は、次のようにします。

C#
bindingSource1.EndEdit();

また、DataSourceに設定しているクラスのプロパティにsetがない場合、値を変更できません。

C#
public string Name { get; set; }

このようにget; set;があるか確認しましょう。

DataTableやBindingListを使っている場合は、元データ側が更新されているか確認することも重要です。

9-4. 行削除時にエラーが出るときの対処法

DataGridViewで行を削除するときにエラーが出る場合、最下行の新規追加用行を削除しようとしている可能性があります。

削除前にIsNewRowを確認しましょう。

C#
if (!row.IsNewRow)
{
dataGridView1.Rows.Remove(row);
}

また、DataSourceにバインドされている場合、DataGridViewの行を直接削除するより、元データから削除する方が適切な場合があります。

DataTableを使っている場合は、次のように削除できます。

C#
if (dataGridView1.CurrentRow != null && !dataGridView1.CurrentRow.IsNewRow)
{
dataGridView1.Rows.Remove(dataGridView1.CurrentRow);
}

複数行を削除する場合は、foreach中にコレクションが変更されることによるエラーにも注意が必要です。選択行を一度リストに変換してから削除すると安全です。

C#
var rows = dataGridView1.SelectedRows
.Cast<DataGridViewRow>()
.Where(r => !r.IsNewRow)
.ToList();

foreach (var row in rows)
{
dataGridView1.Rows.Remove(row);
}

行削除のエラーは、IsNewRowの確認とDataSourceの扱いを理解すると解決しやすくなります。

10. C#の表表示・編集に関するよくある質問

10-1. DataGridViewとDataTableの違いは?

DataGridViewは、画面に表を表示・編集するためのコントロールです。一方、DataTableは、メモリ上で表形式のデータを管理するためのクラスです。

つまり、DataGridViewは「見た目」、DataTableは「データ本体」と考えるとわかりやすいです。

たとえば、DataTableに顧客一覧のデータを入れて、そのDataTableをDataGridViewに表示します。

C#
dataGridView1.DataSource = table;

このように、DataGridViewとDataTableは役割が違いますが、組み合わせて使うことが多いです。

初心者は、まずDataGridView単体で列と行を追加する方法を学び、次にDataTableをDataSourceに設定する方法を覚えると理解しやすいでしょう。

10-2. WPFでもDataGridViewは使える?

DataGridViewは、基本的にWindowsフォームアプリ用のコントロールです。

WPFで表を表示する場合は、DataGridViewではなく、WPFのDataGridを使うのが一般的です。

WPFのDataGridも、表形式のデータ表示や編集ができます。ただし、使い方や設計の考え方はWindowsフォームのDataGridViewとは異なります。

これからC#でデスクトップアプリを学ぶ初心者であれば、まずWindowsフォームアプリとDataGridViewで表の基本を覚えるとよいでしょう。その後、より柔軟な画面設計をしたい場合にWPFのDataGridを学ぶ流れがおすすめです。

10-3. Excelのような表をC#で作れる?

C#のDataGridViewを使えば、Excelのような表を作ることは可能です。

セルの表示、編集、行追加、列追加、並べ替え、チェックボックス、コンボボックスなど、Excelに近い操作を実装できます。

ただし、DataGridViewはExcelそのものではありません。Excelのような数式、複雑なセル結合、高度な印刷設定、シート管理などを完全に再現するには追加の実装が必要です。

単純な一覧表や編集画面であればDataGridViewで十分です。Excelファイルそのものを読み書きしたい場合は、Excel操作用のライブラリを使う方法もあります。

10-4. 初心者はどの表示方法から覚えるべき?

初心者は、次の順番で覚えるのがおすすめです。

まず、DataGridViewに手動で列を追加し、Rows.Add()で行を追加する方法を学びましょう。表の基本構造を理解しやすいからです。

次に、DataTableを作成してDataSourceに設定する方法を覚えます。DataTableを使えるようになると、CSVやデータベースとの連携が理解しやすくなります。

その後、ListやBindingListをDataSourceに設定する方法を学ぶと、C#らしいオブジェクト指向のデータ管理に進めます。

最初からすべてを覚えようとせず、まずは「表を表示する」「セルを編集する」「行を追加・削除する」という基本操作から始めるのがよいでしょう。

まとめ

C#で表を表示・編集するなら、WindowsフォームアプリのDataGridViewが便利です。DataGridViewを使うと、行と列を持つ表を簡単に作成でき、セル編集、行追加、行削除、並べ替え、入力チェック、CSV読み込み、データベース連携など、さまざまな機能を実装できます。

表を表示する方法には、手動で列と行を追加する方法、DataTableをDataSourceに設定する方法、ListをDataSourceに設定する方法があります。初心者は、まずColumns.Add()Rows.Add()で基本を理解し、その後にDataTableやListとの連携を学ぶとスムーズです。

DataGridViewを実用的に使うには、編集可否の設定、入力チェック、列幅の調整、ヘッダー名の変更、表示形式の設定なども重要です。見やすく操作しやすい表にすることで、ユーザーが扱いやすいアプリになります。

CSVやデータベースと組み合わせれば、C#で本格的な管理画面や業務アプリを作成できます。まずは小さな表を表示するところから始めて、少しずつ編集・保存・検索などの機能を追加していきましょう。