Skip to content

第22章 DataGridViewで一覧を表示する

この章では、Windowsフォームアプリで表形式のデータを表示するために、DataGridView の基本を学習します。

第21章では、ListBox を使って社員情報を一覧表示しました。

1001:山田太郎(営業部)
1002:佐藤花子(開発部)
1003:鈴木一郎(総務部)

ListBox は、文字列を縦に並べて表示するには便利です。

しかし、社員情報のように複数の項目を持つデータを表示する場合は、表形式の方が見やすくなります。

社員ID | 社員名 | 部署名 | 入社日 | 給与
1001 | 山田太郎 | 営業部 | 2020/04/01 | 300000
1002 | 佐藤花子 | 開発部 | 2021/04/01 | 320000

このような表形式の表示に使うのが DataGridView です。

この章では、次の流れを学習します。

Employeeクラスを作成する
List<Employee> にサンプルデータを入れる
DataGridViewに一覧表示する
選択された社員を取得する
LINQで検索・絞り込みを行う

後の章では、Oracle Databaseから取得した List<EmployeeListItem>DataGridView に表示します。

この章では、まだDBには接続せず、サンプルデータを使って DataGridView の基本操作に慣れます。


この章では、以下の画像を入れると理解しやすくなります。

図22-1 ListBoxとDataGridViewの違い
図22-2 DataGridViewをフォームに配置した画面
図22-3 DataGridViewのプロパティ設定画面
図22-4 社員一覧をDataGridViewに表示した完成例
図22-5 選択行の社員情報を表示する画面
図22-6 検索フォームと検索結果の画面

画像を挿入する場合は、次のように書けます。

![DataGridViewに社員一覧を表示した画面](images/22_datagridview_employee_list.png)

画像ファイルは、images フォルダにまとめると管理しやすくなります。

CSharpText/
├─ 22_datagridview_basic.md
└─ images/
├─ 22_datagridview_placed.png
├─ 22_datagridview_properties.png
├─ 22_employee_list.png
└─ 22_employee_search.png

この章でできるようになること

Section titled “この章でできるようになること”

この章を終えると、次のことができるようになります。

  • DataGridView の役割を説明できる
  • ListBoxDataGridView の違いを説明できる
  • フォームに DataGridView を配置できる
  • DataGridViewList<T> のデータを表示できる
  • DataSource の基本的な使い方を説明できる
  • Employee クラスの一覧を表形式で表示できる
  • DataGridViewの列見出しを変更できる
  • 選択された行から Employee オブジェクトを取得できる
  • LINQ を使って検索・絞り込みを行える
  • 検索結果をDataGridViewに再表示できる
  • DataGridViewをDB連携アプリで使うイメージを説明できる

項目内容
開発環境Visual Studio 2022
プロジェクト種類Windows フォーム アプリ
対象フレームワーク.NET 8
プロジェクト名Chapter22_DataGridView
DB接続この章ではまだ行わない

作業を始める前に、次の内容を確認してください。

  • Windowsフォームアプリを作成できる
  • フォームにコントロールを配置できる
  • コントロールの NameText を設定できる
  • ボタンクリックイベントを作成できる
  • クラスを作成できる
  • List<T> を使える
  • LINQWhere を使える
  • 第21章の内容をGitに提出済みである

第21章では、ListBox に社員情報を表示しました。

lstEmployees.Items.Add(employee.GetDisplayText());

表示例:

1001:山田太郎(営業部)
1002:佐藤花子(開発部)

この方法は簡単ですが、すべてを1つの文字列として表示しています。

そのため、次のような問題があります。

社員IDだけを列として見にくい
部署名だけを見比べにくい
給与や入社日を追加すると長くなる
表形式で整理しにくい

DataGridView は、表形式でデータを表示するためのコントロールです。

社員ID | 社員名 | 部署名 | 入社日 | 給与
1001 | 山田太郎 | 営業部 | 2020/04/01 | 300000
1002 | 佐藤花子 | 開発部 | 2021/04/01 | 320000

複数のプロパティを持つオブジェクトを一覧表示する場合に便利です。

特に、次のようなデータ表示に向いています。

社員一覧
商品一覧
顧客一覧
売上一覧
検索結果一覧

後の章では、Oracle Databaseから取得した社員一覧を DataGridView に表示します。


コントロール主な用途表示形式
ListBox文字列や単純な項目の一覧縦のリスト
DataGridView複数列を持つデータ一覧表形式

この章では、DataGridView を使って、Employee オブジェクトの一覧を表示します。


Windowsフォームアプリを作成する

Section titled “Windowsフォームアプリを作成する”

Visual Studio 2022を起動し、次の手順でプロジェクトを作成します。

1. 「新しいプロジェクトの作成」をクリックする
2. 「Windows フォーム アプリ」を選択する
3. 「次へ」をクリックする
4. プロジェクト名に Chapter22_DataGridView と入力する
5. 保存場所を確認する
6. 「次へ」をクリックする
7. フレームワークで .NET 8.0 を選択する
8. 「作成」をクリックする

作成直後に空のフォームが表示されます。

まずは実行し、空のウィンドウが表示されることを確認してください。


Employee.cs を追加し、次のクラスを作成します。

namespace Chapter22_DataGridView
{
public class Employee
{
public int EmployeeId { get; set; }
public string EmployeeName { get; set; } = "";
public string DepartmentName { get; set; } = "";
public DateTime HireDate { get; set; }
public decimal? Salary { get; set; }
}
}

このクラスは、社員1人分の情報を表します。

プロパティ意味
EmployeeId社員ID
EmployeeName社員名
DepartmentName部署名
HireDate入社日
Salary給与

Salarydecimal? にしています。

public decimal? Salary { get; set; }

これは、給与が未設定の可能性を表すためです。

DB連携では、salary がNULLになる可能性があるため、この章でもnull許容型として扱います。


フォームに次のコントロールを配置してください。

コントロールNameText
ButtonbtnLoad一覧表示
DataGridViewdgvEmployeesなし
LabellblCount件数:0件

配置例:

[一覧表示]
件数:0件
+---------------------------------------------+
| 社員ID | 社員名 | 部署名 | 入社日 | 給与 |
+---------------------------------------------+

DataGridViewのプロパティを設定する

Section titled “DataGridViewのプロパティを設定する”

dgvEmployees を選択し、プロパティウィンドウで次の設定を行います。

プロパティ設定値意味
NamedgvEmployeesC#コードから使う名前
ReadOnlyTrue直接編集させない
AllowUserToAddRowsFalse最下行の空行を表示しない
SelectionModeFullRowSelect行全体を選択する
MultiSelectFalse複数行選択をしない
AutoSizeColumnsModeFill列幅を自動調整する

プロパティウィンドウで見つけにくい場合は、後でコードから設定しても構いません。


Form1.cs に、DataGridViewの初期設定メソッドを作ります。

private void SetupDataGridView()
{
dgvEmployees.ReadOnly = true;
dgvEmployees.AllowUserToAddRows = false;
dgvEmployees.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dgvEmployees.MultiSelect = false;
dgvEmployees.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}

コンストラクターで呼び出します。

public Form1()
{
InitializeComponent();
SetupDataGridView();
}

22-5 DataGridViewに一覧を表示する

Section titled “22-5 DataGridViewに一覧を表示する”

Form1.cs のフォームクラスに、社員一覧を保持するフィールドを用意します。

namespace Chapter22_DataGridView
{
public partial class Form1 : Form
{
private List<Employee> _employees = new List<Employee>();
public Form1()
{
InitializeComponent();
SetupDataGridView();
}
}
}

_employees は、画面で扱う社員一覧データです。


Form1.cs に、サンプルデータを作成するメソッドを追加します。

private List<Employee> CreateSampleEmployees()
{
return new List<Employee>
{
new Employee
{
EmployeeId = 1001,
EmployeeName = "山田太郎",
DepartmentName = "営業部",
HireDate = new DateTime(2020, 4, 1),
Salary = 300000
},
new Employee
{
EmployeeId = 1002,
EmployeeName = "佐藤花子",
DepartmentName = "開発部",
HireDate = new DateTime(2021, 4, 1),
Salary = 320000
},
new Employee
{
EmployeeId = 1003,
EmployeeName = "鈴木一郎",
DepartmentName = "総務部",
HireDate = new DateTime(2019, 10, 1),
Salary = 280000
},
new Employee
{
EmployeeId = 1004,
EmployeeName = "田中次郎",
DepartmentName = "営業部",
HireDate = new DateTime(2022, 4, 1),
Salary = null
}
};
}

DataGridView に一覧を表示するメソッドを作成します。

private void DisplayEmployees(List<Employee> employees)
{
dgvEmployees.DataSource = null;
dgvEmployees.DataSource = employees;
lblCount.Text = $"件数:{employees.Count}";
SetColumnHeaders();
}

DataSourceList<Employee> を設定すると、Employee のプロパティが列として表示されます。

dgvEmployees.DataSource = employees;

ただし、再表示する場合に古い表示が残らないよう、一度 null を設定しています。

dgvEmployees.DataSource = null;

DataGridView は、初期状態ではプロパティ名を列名として表示します。

EmployeeId
EmployeeName
DepartmentName
HireDate
Salary

画面では日本語の見出しにしたいので、列見出しを変更します。

private void SetColumnHeaders()
{
if (dgvEmployees.Columns["EmployeeId"] != null)
{
dgvEmployees.Columns["EmployeeId"].HeaderText = "社員ID";
}
if (dgvEmployees.Columns["EmployeeName"] != null)
{
dgvEmployees.Columns["EmployeeName"].HeaderText = "社員名";
}
if (dgvEmployees.Columns["DepartmentName"] != null)
{
dgvEmployees.Columns["DepartmentName"].HeaderText = "部署名";
}
if (dgvEmployees.Columns["HireDate"] != null)
{
dgvEmployees.Columns["HireDate"].HeaderText = "入社日";
}
if (dgvEmployees.Columns["Salary"] != null)
{
dgvEmployees.Columns["Salary"].HeaderText = "給与";
}
}

btnLoad をダブルクリックして、クリックイベントを作成します。

private void btnLoad_Click(object sender, EventArgs e)
{
_employees = CreateSampleEmployees();
DisplayEmployees(_employees);
}

実行し、一覧表示 ボタンをクリックしてください。

社員一覧が DataGridView に表示されれば成功です。


DataSource は、表示するデータの元を指定するプロパティです。

dgvEmployees.DataSource = employees;

この場合、employees がDataGridViewの表示元になります。

List<Employee>
DataGridView

Employee クラスのプロパティが、DataGridViewの列になります。

EmployeeId → 列
EmployeeName → 列
DepartmentName → 列
HireDate → 列
Salary → 列

この章では、DataGridViewを表示専用として扱います。

dgvEmployees.ReadOnly = true;

利用者がDataGridView上で直接値を編集することはしません。

登録や更新を行う場合は、別の入力欄やフォームを用意する方が、初学者には分かりやすいです。


List<Employee> の中身を変更しただけでは、画面が自動的に更新されないことがあります。

この章では、表示を更新したいときに次のようにします。

dgvEmployees.DataSource = null;
dgvEmployees.DataSource = employees;

これは学習用として分かりやすい方法です。

実務では、BindingList<T>BindingSource を使って、より柔軟にデータと画面を連動させることもあります。

この章では、まず DataSourceList<T> を設定する基本を理解しましょう。


22-7 選択された社員を取得する

Section titled “22-7 選択された社員を取得する”

DataGridViewで選択されている行は、CurrentRow から取得できます。

DataGridViewRow row = dgvEmployees.CurrentRow;

ただし、何も選択されていない場合は、CurrentRownull になる可能性があります。


フォームに次のボタンを追加してください。

コントロールNameText
ButtonbtnShowDetail選択行を表示

配置例:

[一覧表示] [選択行を表示]

btnShowDetail をダブルクリックし、クリックイベントを作成します。

private void btnShowDetail_Click(object sender, EventArgs e)
{
if (dgvEmployees.CurrentRow == null)
{
MessageBox.Show("社員を選択してください。");
return;
}
Employee? employee = dgvEmployees.CurrentRow.DataBoundItem as Employee;
if (employee == null)
{
MessageBox.Show("社員情報を取得できませんでした。");
return;
}
string salaryText = employee.Salary.HasValue
? $"{employee.Salary.Value}"
: "未設定";
string message =
$"社員ID:{employee.EmployeeId}\n" +
$"社員名:{employee.EmployeeName}\n" +
$"部署名:{employee.DepartmentName}\n" +
$"入社日:{employee.HireDate.ToString("yyyy/MM/dd")}\n" +
$"給与:{salaryText}";
MessageBox.Show(message);
}

DataBoundItem は、その行に対応する元データを表します。

今回の場合、DataGridViewの元データは List<Employee> です。

そのため、選択行の DataBoundItemEmployee オブジェクトになります。

Employee? employee = dgvEmployees.CurrentRow.DataBoundItem as Employee;

この書き方により、選択された行の社員データを取得できます。


検索用コントロールを追加する

Section titled “検索用コントロールを追加する”

フォームに次のコントロールを追加してください。

コントロールNameText
LabellblKeyword検索キーワード
TextBoxtxtKeyword空欄
ButtonbtnSearch検索
ButtonbtnClearクリア

配置例:

検索キーワード [ ] [検索] [クリア]

btnSearch をダブルクリックし、クリックイベントを作成します。

private void btnSearch_Click(object sender, EventArgs e)
{
string keyword = txtKeyword.Text.Trim();
if (string.IsNullOrWhiteSpace(keyword))
{
DisplayEmployees(_employees);
return;
}
List<Employee> results = _employees
.Where(employee => employee.EmployeeName.Contains(keyword))
.ToList();
DisplayEmployees(results);
}

ここでは、社員名にキーワードが含まれる社員だけを表示しています。

employee.EmployeeName.Contains(keyword)

検索結果が0件の場合は、メッセージを表示してもよいです。

private void btnSearch_Click(object sender, EventArgs e)
{
string keyword = txtKeyword.Text.Trim();
if (string.IsNullOrWhiteSpace(keyword))
{
DisplayEmployees(_employees);
return;
}
List<Employee> results = _employees
.Where(employee => employee.EmployeeName.Contains(keyword))
.ToList();
DisplayEmployees(results);
if (results.Count == 0)
{
MessageBox.Show("該当する社員は見つかりませんでした。");
}
}

btnClear をダブルクリックし、クリックイベントを作成します。

private void btnClear_Click(object sender, EventArgs e)
{
txtKeyword.Clear();
DisplayEmployees(_employees);
}

これで、検索条件をクリアし、全件表示に戻せます。


社員名または部署名で検索する

Section titled “社員名または部署名で検索する”

社員名だけでなく、部署名も検索対象にしたい場合は、条件を追加します。

List<Employee> results = _employees
.Where(employee =>
employee.EmployeeName.Contains(keyword) ||
employee.DepartmentName.Contains(keyword))
.ToList();

|| は「または」を表します。

社員名にキーワードを含む
または
部署名にキーワードを含む

検索ボタンの処理を次のように変更できます。

private void btnSearch_Click(object sender, EventArgs e)
{
string keyword = txtKeyword.Text.Trim();
if (string.IsNullOrWhiteSpace(keyword))
{
DisplayEmployees(_employees);
return;
}
List<Employee> results = _employees
.Where(employee =>
employee.EmployeeName.Contains(keyword) ||
employee.DepartmentName.Contains(keyword))
.ToList();
DisplayEmployees(results);
if (results.Count == 0)
{
MessageBox.Show("該当する社員は見つかりませんでした。");
}
}

22-10 給与が未設定の社員を抽出する

Section titled “22-10 給与が未設定の社員を抽出する”

Salarydecimal? です。

給与が未設定の社員は、Salary == null で判定できます。

フォームに次のボタンを追加します。

| コントロール | Name | Text | |---|---| | Button | btnNoSalary | 給与未設定 |

クリックイベントを作成します。

private void btnNoSalary_Click(object sender, EventArgs e)
{
List<Employee> results = _employees
.Where(employee => employee.Salary == null)
.ToList();
DisplayEmployees(results);
if (results.Count == 0)
{
MessageBox.Show("給与未設定の社員は見つかりませんでした。");
}
}

第11章で学んだnull許容型が、画面アプリでも使われています。


ここまでの Form1.cs の主要部分は、次のようになります。

namespace Chapter22_DataGridView
{
public partial class Form1 : Form
{
private List<Employee> _employees = new List<Employee>();
public Form1()
{
InitializeComponent();
SetupDataGridView();
}
private void SetupDataGridView()
{
dgvEmployees.ReadOnly = true;
dgvEmployees.AllowUserToAddRows = false;
dgvEmployees.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dgvEmployees.MultiSelect = false;
dgvEmployees.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
private List<Employee> CreateSampleEmployees()
{
return new List<Employee>
{
new Employee
{
EmployeeId = 1001,
EmployeeName = "山田太郎",
DepartmentName = "営業部",
HireDate = new DateTime(2020, 4, 1),
Salary = 300000
},
new Employee
{
EmployeeId = 1002,
EmployeeName = "佐藤花子",
DepartmentName = "開発部",
HireDate = new DateTime(2021, 4, 1),
Salary = 320000
},
new Employee
{
EmployeeId = 1003,
EmployeeName = "鈴木一郎",
DepartmentName = "総務部",
HireDate = new DateTime(2019, 10, 1),
Salary = 280000
},
new Employee
{
EmployeeId = 1004,
EmployeeName = "田中次郎",
DepartmentName = "営業部",
HireDate = new DateTime(2022, 4, 1),
Salary = null
}
};
}
private void DisplayEmployees(List<Employee> employees)
{
dgvEmployees.DataSource = null;
dgvEmployees.DataSource = employees;
lblCount.Text = $"件数:{employees.Count}";
SetColumnHeaders();
}
private void SetColumnHeaders()
{
if (dgvEmployees.Columns["EmployeeId"] != null)
{
dgvEmployees.Columns["EmployeeId"].HeaderText = "社員ID";
}
if (dgvEmployees.Columns["EmployeeName"] != null)
{
dgvEmployees.Columns["EmployeeName"].HeaderText = "社員名";
}
if (dgvEmployees.Columns["DepartmentName"] != null)
{
dgvEmployees.Columns["DepartmentName"].HeaderText = "部署名";
}
if (dgvEmployees.Columns["HireDate"] != null)
{
dgvEmployees.Columns["HireDate"].HeaderText = "入社日";
}
if (dgvEmployees.Columns["Salary"] != null)
{
dgvEmployees.Columns["Salary"].HeaderText = "給与";
}
}
private void btnLoad_Click(object sender, EventArgs e)
{
_employees = CreateSampleEmployees();
DisplayEmployees(_employees);
}
private void btnShowDetail_Click(object sender, EventArgs e)
{
if (dgvEmployees.CurrentRow == null)
{
MessageBox.Show("社員を選択してください。");
return;
}
Employee? employee = dgvEmployees.CurrentRow.DataBoundItem as Employee;
if (employee == null)
{
MessageBox.Show("社員情報を取得できませんでした。");
return;
}
string salaryText = employee.Salary.HasValue
? $"{employee.Salary.Value}"
: "未設定";
string message =
$"社員ID:{employee.EmployeeId}\n" +
$"社員名:{employee.EmployeeName}\n" +
$"部署名:{employee.DepartmentName}\n" +
$"入社日:{employee.HireDate.ToString("yyyy/MM/dd")}\n" +
$"給与:{salaryText}";
MessageBox.Show(message);
}
private void btnSearch_Click(object sender, EventArgs e)
{
string keyword = txtKeyword.Text.Trim();
if (string.IsNullOrWhiteSpace(keyword))
{
DisplayEmployees(_employees);
return;
}
List<Employee> results = _employees
.Where(employee =>
employee.EmployeeName.Contains(keyword) ||
employee.DepartmentName.Contains(keyword))
.ToList();
DisplayEmployees(results);
if (results.Count == 0)
{
MessageBox.Show("該当する社員は見つかりませんでした。");
}
}
private void btnClear_Click(object sender, EventArgs e)
{
txtKeyword.Clear();
DisplayEmployees(_employees);
}
private void btnNoSalary_Click(object sender, EventArgs e)
{
List<Employee> results = _employees
.Where(employee => employee.Salary == null)
.ToList();
DisplayEmployees(results);
if (results.Count == 0)
{
MessageBox.Show("給与未設定の社員は見つかりませんでした。");
}
}
}
}

この章では、サンプルデータを作成してDataGridViewに表示しました。

_employees = CreateSampleEmployees();
DisplayEmployees(_employees);

後の章では、この部分をOracle Databaseからの取得処理に置き換えます。

EmployeeRepository repository = new EmployeeRepository();
List<EmployeeListItem> employees = repository.GetEmployeeListItems();
dgvEmployees.DataSource = employees;

つまり、画面側の考え方は大きく変わりません。

この章:
サンプルデータ
List<Employee>
DataGridView
次章:
Oracle Database
List<EmployeeListItem>
DataGridView

この章で学ぶ DataGridViewDataSource は、次章のDB連携でそのまま使います。


つまずき原因対応
DataGridViewが表示されないフォームに配置していないdgvEmployees が存在するか確認する
dgvEmployees が見つからないNameを変更していないプロパティの Name を確認する
一覧が表示されないDataSource を設定していないdgvEmployees.DataSource = employees; を確認する
列名が英語のままHeaderTextを設定していないSetColumnHeaders を呼び出す
件数が更新されないlblCount.Text を変更していないDisplayEmployees 内で更新する
選択行を取得できない行が選択されていないCurrentRow == null を確認する
DataBoundItem がnullになるDataSourceが正しく設定されていないDataSourceList<Employee> を設定する
検索しても結果が変わらない検索後に再表示していないDisplayEmployees(results) を呼ぶ
検索後に全件に戻せない元データを保持していない_employees に全件データを保持する
給与未設定の検索が分からないdecimal? に慣れていないemployee.Salary == null で判定する

次の項目について、自分で説明できるか確認してください。

  • DataGridView とは何かを説明できる
  • ListBoxDataGridView の違いを説明できる
  • フォームに DataGridView を配置できる
  • DataGridViewName を設定できる
  • DataSourceList<Employee> を設定できる
  • Employee のプロパティが列として表示されることを説明できる
  • 列見出しを変更できる
  • ReadOnlySelectionMode などの基本設定ができる
  • 選択行の DataBoundItem から Employee を取得できる
  • LINQで検索条件に合う社員を抽出できる
  • 検索結果をDataGridViewに再表示できる
  • DBから取得した一覧も同じようにDataGridViewへ表示できることを説明できる

研修の進め方によっては、隣の人または近くの人と説明確認を行います。

次の内容を、自分の言葉で説明してください。

  1. ListBoxDataGridView は何が違いますか。
  2. DataGridView.DataSource には何を設定しますか。
  3. List<Employee> をDataGridViewに設定すると、何が列として表示されますか。
  4. dgvEmployees.DataSource = null; を一度行う理由は何ですか。
  5. CurrentRow は何を表しますか。
  6. DataBoundItem は何を表しますか。
  7. 検索後に全件表示へ戻すために、なぜ _employees が必要ですか。
  8. 次章で、サンプルデータは何に置き換わる予定ですか。

この章の演習課題に取り組みます。

制限時間は 90分 です。

時間内にすべて完成しなくても構いません。
できたところまでを保存し、Gitに提出してください。


課題22-1 Windowsフォームアプリを作成する

Section titled “課題22-1 Windowsフォームアプリを作成する”

Windowsフォームアプリのプロジェクトを作成してください。

条件:

  • プロジェクト名は Chapter22_DataGridView とする
  • フレームワークは .NET 8.0 を選択する
  • 初期状態で実行し、フォームが表示されることを確認する

課題22-2 Employeeクラスを作成する

Section titled “課題22-2 Employeeクラスを作成する”

社員情報を表す Employee クラスを作成してください。

プロパティ:

プロパティ名
EmployeeIdint
EmployeeNamestring
DepartmentNamestring
HireDateDateTime
Salarydecimal?

条件:

  • Employee.cs を作成する
  • 文字列プロパティには初期値 "" を設定する
  • Salarydecimal? にする

フォームにDataGridViewを配置してください。

配置するコントロール:

コントロールNameText
ButtonbtnLoad一覧表示
DataGridViewdgvEmployeesなし
LabellblCount件数:0件

条件:

  • dgvEmployeesReadOnlyTrue にする
  • AllowUserToAddRowsFalse にする
  • SelectionModeFullRowSelect にする
  • MultiSelectFalse にする

課題22-4 サンプルデータを表示する

Section titled “課題22-4 サンプルデータを表示する”

List<Employee> のサンプルデータを作成し、DataGridViewに表示してください。

条件:

  • CreateSampleEmployees メソッドを作成する
  • 4件以上の社員データを用意する
  • DisplayEmployees メソッドを作成する
  • dgvEmployees.DataSource にリストを設定する
  • 件数を lblCount に表示する

課題22-5 列見出しを日本語にする

Section titled “課題22-5 列見出しを日本語にする”

DataGridViewの列見出しを日本語に変更してください。

条件:

  • EmployeeId社員ID にする
  • EmployeeName社員名 にする
  • DepartmentName部署名 にする
  • HireDate入社日 にする
  • Salary給与 にする

課題22-6 選択行の社員情報を表示する

Section titled “課題22-6 選択行の社員情報を表示する”

DataGridViewで選択した社員を、メッセージボックスで表示してください。

条件:

  • btnShowDetail ボタンを追加する
  • CurrentRow を使う
  • DataBoundItem から Employee を取得する
  • 何も選択されていない場合はメッセージを表示する

社員名にキーワードを含む社員だけを表示してください。

条件:

  • txtKeyword を追加する
  • btnSearch を追加する
  • WhereContains を使う
  • 検索結果をDataGridViewに表示する
  • 0件の場合はメッセージを表示する

課題22-8 部署名も検索対象にする

Section titled “課題22-8 部署名も検索対象にする”

社員名だけでなく、部署名も検索対象にしてください。

条件:

  • 社員名または部署名にキーワードを含む社員を表示する
  • || を使う
  • 検索結果件数を表示する

検索条件をクリアして、全件表示に戻すボタンを作成してください。

条件:

  • btnClear を追加する
  • txtKeyword.Clear() を使う
  • _employees を再表示する

課題22-10 給与未設定の社員を抽出する

Section titled “課題22-10 給与未設定の社員を抽出する”

給与が未設定の社員だけを表示してください。

条件:

  • btnNoSalary を追加する
  • employee.Salary == null で判定する
  • 検索結果をDataGridViewに表示する
  • 0件の場合はメッセージを表示する

課題22-11 入社日の新しい順に並び替える

Section titled “課題22-11 入社日の新しい順に並び替える”

入社日の新しい順に社員一覧を表示してください。

条件:

  • btnSortHireDate を追加する
  • OrderByDescending を使う
  • 並び替え後の結果をDataGridViewに表示する

課題が終わったら、できたところまでをGitに提出します。

Terminal window
git status
git add .
git commit -m "Chapter22 DataGridViewで一覧表示"
git push

Gitの操作でエラーが出た場合は、自己判断で同じ操作を繰り返さず、講師に確認してください。


  • Windowsフォームアプリを作成できている
  • Employee クラスを作成している
  • DataGridView を配置している
  • DataGridViewNamedgvEmployees にしている
  • DataSourceList<Employee> を設定している
  • サンプルデータを一覧表示できている
  • 件数を表示できている
  • 列見出しを日本語に変更している
  • 選択行の社員情報を取得できている
  • LINQで検索できている
  • 検索結果を再表示できている
  • 全件表示に戻せる
  • インデントが整っている
  • Gitにcommitしている
  • Gitにpushしている

この章では、Windowsフォームアプリで DataGridView を使って一覧を表示する方法を学習しました。

この章で学んだ主な内容は次の通りです。

  • DataGridView は表形式でデータを表示するためのコントロールである
  • ListBox は単純な一覧、DataGridView は複数列の一覧に向いている
  • DataGridView.DataSourceList<T> を設定すると一覧表示できる
  • Employee クラスのプロパティがDataGridViewの列として表示される
  • HeaderText を変更すると、列見出しを日本語にできる
  • ReadOnlytrue にすると、画面上で直接編集させないようにできる
  • CurrentRow で現在選択されている行を取得できる
  • DataBoundItem から、選択行に対応する元のオブジェクトを取得できる
  • LINQを使うと、社員名や部署名で検索・絞り込みができる
  • 検索結果も DataSource に設定し直すことで再表示できる
  • 元データを _employees に保持しておくと、検索後に全件表示へ戻せる
  • DBから取得したデータも、List<T> にすれば同じようにDataGridViewへ表示できる

次章では、WindowsフォームアプリからOracle Databaseを利用する ことを学習します。

この章ではサンプルデータをDataGridViewに表示しました。
次章では、Oracle Databaseの employees 表と departments 表から取得した社員一覧を、DataGridViewに表示します。