第22章 DataGridViewで一覧を表示する
この章の目的
Section titled “この章の目的”この章では、Windowsフォームアプリで表形式のデータを表示するために、DataGridView の基本を学習します。
第21章では、ListBox を使って社員情報を一覧表示しました。
1001:山田太郎(営業部)1002:佐藤花子(開発部)1003:鈴木一郎(総務部)ListBox は、文字列を縦に並べて表示するには便利です。
しかし、社員情報のように複数の項目を持つデータを表示する場合は、表形式の方が見やすくなります。
社員ID | 社員名 | 部署名 | 入社日 | 給与1001 | 山田太郎 | 営業部 | 2020/04/01 | 3000001002 | 佐藤花子 | 開発部 | 2021/04/01 | 320000このような表形式の表示に使うのが DataGridView です。
この章では、次の流れを学習します。
Employeeクラスを作成する ↓List<Employee> にサンプルデータを入れる ↓DataGridViewに一覧表示する ↓選択された社員を取得する ↓LINQで検索・絞り込みを行う後の章では、Oracle Databaseから取得した List<EmployeeListItem> を DataGridView に表示します。
この章では、まだDBには接続せず、サンプルデータを使って DataGridView の基本操作に慣れます。
挿絵・スクリーンショット案
Section titled “挿絵・スクリーンショット案”この章では、以下の画像を入れると理解しやすくなります。
図22-1 ListBoxとDataGridViewの違い図22-2 DataGridViewをフォームに配置した画面図22-3 DataGridViewのプロパティ設定画面図22-4 社員一覧をDataGridViewに表示した完成例図22-5 選択行の社員情報を表示する画面図22-6 検索フォームと検索結果の画面画像を挿入する場合は、次のように書けます。
画像ファイルは、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の役割を説明できるListBoxとDataGridViewの違いを説明できる- フォームに
DataGridViewを配置できる DataGridViewにList<T>のデータを表示できるDataSourceの基本的な使い方を説明できるEmployeeクラスの一覧を表形式で表示できる- DataGridViewの列見出しを変更できる
- 選択された行から
Employeeオブジェクトを取得できる LINQを使って検索・絞り込みを行える- 検索結果をDataGridViewに再表示できる
- DataGridViewをDB連携アプリで使うイメージを説明できる
本章で使用する環境
Section titled “本章で使用する環境”| 項目 | 内容 |
|---|---|
| 開発環境 | Visual Studio 2022 |
| プロジェクト種類 | Windows フォーム アプリ |
| 対象フレームワーク | .NET 8 |
| プロジェクト名 | Chapter22_DataGridView |
| DB接続 | この章ではまだ行わない |
作業前チェック
Section titled “作業前チェック”作業を始める前に、次の内容を確認してください。
- Windowsフォームアプリを作成できる
- フォームにコントロールを配置できる
- コントロールの
NameとTextを設定できる - ボタンクリックイベントを作成できる
- クラスを作成できる
-
List<T>を使える -
LINQのWhereを使える - 第21章の内容をGitに提出済みである
22-1 DataGridViewとは?
Section titled “22-1 DataGridViewとは?”ListBoxの限界
Section titled “ListBoxの限界”第21章では、ListBox に社員情報を表示しました。
lstEmployees.Items.Add(employee.GetDisplayText());表示例:
1001:山田太郎(営業部)1002:佐藤花子(開発部)この方法は簡単ですが、すべてを1つの文字列として表示しています。
そのため、次のような問題があります。
社員IDだけを列として見にくい部署名だけを見比べにくい給与や入社日を追加すると長くなる表形式で整理しにくいDataGridViewの特徴
Section titled “DataGridViewの特徴”DataGridView は、表形式でデータを表示するためのコントロールです。
社員ID | 社員名 | 部署名 | 入社日 | 給与1001 | 山田太郎 | 営業部 | 2020/04/01 | 3000001002 | 佐藤花子 | 開発部 | 2021/04/01 | 320000複数のプロパティを持つオブジェクトを一覧表示する場合に便利です。
特に、次のようなデータ表示に向いています。
社員一覧商品一覧顧客一覧売上一覧検索結果一覧後の章では、Oracle Databaseから取得した社員一覧を DataGridView に表示します。
ListBoxとDataGridViewの違い
Section titled “ListBoxとDataGridViewの違い”| コントロール | 主な用途 | 表示形式 |
|---|---|---|
ListBox | 文字列や単純な項目の一覧 | 縦のリスト |
DataGridView | 複数列を持つデータ一覧 | 表形式 |
この章では、DataGridView を使って、Employee オブジェクトの一覧を表示します。
22-2 プロジェクトを作成する
Section titled “22-2 プロジェクトを作成する”Windowsフォームアプリを作成する
Section titled “Windowsフォームアプリを作成する”Visual Studio 2022を起動し、次の手順でプロジェクトを作成します。
1. 「新しいプロジェクトの作成」をクリックする2. 「Windows フォーム アプリ」を選択する3. 「次へ」をクリックする4. プロジェクト名に Chapter22_DataGridView と入力する5. 保存場所を確認する6. 「次へ」をクリックする7. フレームワークで .NET 8.0 を選択する8. 「作成」をクリックする作成直後に空のフォームが表示されます。
まずは実行し、空のウィンドウが表示されることを確認してください。
22-3 Employeeクラスを作成する
Section titled “22-3 Employeeクラスを作成する”Employeeクラス
Section titled “Employeeクラス”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 | 給与 |
Salary は decimal? にしています。
public decimal? Salary { get; set; }これは、給与が未設定の可能性を表すためです。
DB連携では、salary がNULLになる可能性があるため、この章でもnull許容型として扱います。
22-4 DataGridViewを配置する
Section titled “22-4 DataGridViewを配置する”画面に配置するコントロール
Section titled “画面に配置するコントロール”フォームに次のコントロールを配置してください。
| コントロール | Name | Text |
|---|---|---|
Button | btnLoad | 一覧表示 |
DataGridView | dgvEmployees | なし |
Label | lblCount | 件数:0件 |
配置例:
[一覧表示]
件数:0件
+---------------------------------------------+| 社員ID | 社員名 | 部署名 | 入社日 | 給与 |+---------------------------------------------+DataGridViewのプロパティを設定する
Section titled “DataGridViewのプロパティを設定する”dgvEmployees を選択し、プロパティウィンドウで次の設定を行います。
| プロパティ | 設定値 | 意味 |
|---|---|---|
Name | dgvEmployees | C#コードから使う名前 |
ReadOnly | True | 直接編集させない |
AllowUserToAddRows | False | 最下行の空行を表示しない |
SelectionMode | FullRowSelect | 行全体を選択する |
MultiSelect | False | 複数行選択をしない |
AutoSizeColumnsMode | Fill | 列幅を自動調整する |
プロパティウィンドウで見つけにくい場合は、後でコードから設定しても構いません。
コードで設定する場合
Section titled “コードで設定する場合”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に一覧を表示する”フォームにListを用意する
Section titled “フォームにListを用意する”Form1.cs のフォームクラスに、社員一覧を保持するフィールドを用意します。
namespace Chapter22_DataGridView{ public partial class Form1 : Form { private List<Employee> _employees = new List<Employee>();
public Form1() { InitializeComponent();
SetupDataGridView(); } }}_employees は、画面で扱う社員一覧データです。
サンプルデータを作成する
Section titled “サンプルデータを作成する”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に表示するメソッド
Section titled “DataGridViewに表示するメソッド”DataGridView に一覧を表示するメソッドを作成します。
private void DisplayEmployees(List<Employee> employees){ dgvEmployees.DataSource = null; dgvEmployees.DataSource = employees;
lblCount.Text = $"件数:{employees.Count}件";
SetColumnHeaders();}DataSource に List<Employee> を設定すると、Employee のプロパティが列として表示されます。
dgvEmployees.DataSource = employees;ただし、再表示する場合に古い表示が残らないよう、一度 null を設定しています。
dgvEmployees.DataSource = null;列見出しを変更する
Section titled “列見出しを変更する”DataGridView は、初期状態ではプロパティ名を列名として表示します。
EmployeeIdEmployeeNameDepartmentNameHireDateSalary画面では日本語の見出しにしたいので、列見出しを変更します。
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 = "給与"; }}一覧表示ボタンのイベント
Section titled “一覧表示ボタンのイベント”btnLoad をダブルクリックして、クリックイベントを作成します。
private void btnLoad_Click(object sender, EventArgs e){ _employees = CreateSampleEmployees();
DisplayEmployees(_employees);}実行し、一覧表示 ボタンをクリックしてください。
社員一覧が DataGridView に表示されれば成功です。
22-6 DataSourceの考え方
Section titled “22-6 DataSourceの考え方”DataSourceとは
Section titled “DataSourceとは”DataSource は、表示するデータの元を指定するプロパティです。
dgvEmployees.DataSource = employees;この場合、employees がDataGridViewの表示元になります。
List<Employee> ↓DataGridViewEmployee クラスのプロパティが、DataGridViewの列になります。
EmployeeId → 列EmployeeName → 列DepartmentName → 列HireDate → 列Salary → 列表示専用として使う
Section titled “表示専用として使う”この章では、DataGridViewを表示専用として扱います。
dgvEmployees.ReadOnly = true;利用者がDataGridView上で直接値を編集することはしません。
登録や更新を行う場合は、別の入力欄やフォームを用意する方が、初学者には分かりやすいです。
再表示するときの注意
Section titled “再表示するときの注意”List<Employee> の中身を変更しただけでは、画面が自動的に更新されないことがあります。
この章では、表示を更新したいときに次のようにします。
dgvEmployees.DataSource = null;dgvEmployees.DataSource = employees;これは学習用として分かりやすい方法です。
実務では、BindingList<T> や BindingSource を使って、より柔軟にデータと画面を連動させることもあります。
この章では、まず DataSource に List<T> を設定する基本を理解しましょう。
22-7 選択された社員を取得する
Section titled “22-7 選択された社員を取得する”CurrentRowを使う
Section titled “CurrentRowを使う”DataGridViewで選択されている行は、CurrentRow から取得できます。
DataGridViewRow row = dgvEmployees.CurrentRow;ただし、何も選択されていない場合は、CurrentRow が null になる可能性があります。
詳細表示ボタンを追加する
Section titled “詳細表示ボタンを追加する”フォームに次のボタンを追加してください。
| コントロール | Name | Text |
|---|---|---|
Button | btnShowDetail | 選択行を表示 |
配置例:
[一覧表示] [選択行を表示]選択行のEmployeeを取得する
Section titled “選択行のEmployeeを取得する”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とは
Section titled “DataBoundItemとは”DataBoundItem は、その行に対応する元データを表します。
今回の場合、DataGridViewの元データは List<Employee> です。
そのため、選択行の DataBoundItem は Employee オブジェクトになります。
Employee? employee = dgvEmployees.CurrentRow.DataBoundItem as Employee;この書き方により、選択された行の社員データを取得できます。
22-8 社員名で検索する
Section titled “22-8 社員名で検索する”検索用コントロールを追加する
Section titled “検索用コントロールを追加する”フォームに次のコントロールを追加してください。
| コントロール | Name | Text |
|---|---|---|
Label | lblKeyword | 検索キーワード |
TextBox | txtKeyword | 空欄 |
Button | btnSearch | 検索 |
Button | btnClear | クリア |
配置例:
検索キーワード [ ] [検索] [クリア]検索ボタンのイベント
Section titled “検索ボタンのイベント”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件の場合
Section titled “検索結果0件の場合”検索結果が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("該当する社員は見つかりませんでした。"); }}クリアボタンのイベント
Section titled “クリアボタンのイベント”btnClear をダブルクリックし、クリックイベントを作成します。
private void btnClear_Click(object sender, EventArgs e){ txtKeyword.Clear();
DisplayEmployees(_employees);}これで、検索条件をクリアし、全件表示に戻せます。
22-9 部署名でも検索する
Section titled “22-9 部署名でも検索する”社員名または部署名で検索する
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 給与が未設定の社員を抽出する”nullを条件にする
Section titled “nullを条件にする”Salary は decimal? です。
給与が未設定の社員は、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許容型が、画面アプリでも使われています。
22-11 コード全体の例
Section titled “22-11 コード全体の例”ここまでの 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("給与未設定の社員は見つかりませんでした。"); } } }}22-12 DB連携へのつながり
Section titled “22-12 DB連携へのつながり”この章では、サンプルデータを作成して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この章で学ぶ DataGridView と DataSource は、次章のDB連携でそのまま使います。
よくあるつまずき
Section titled “よくあるつまずき”| つまずき | 原因 | 対応 |
|---|---|---|
| DataGridViewが表示されない | フォームに配置していない | dgvEmployees が存在するか確認する |
dgvEmployees が見つからない | Nameを変更していない | プロパティの Name を確認する |
| 一覧が表示されない | DataSource を設定していない | dgvEmployees.DataSource = employees; を確認する |
| 列名が英語のまま | HeaderTextを設定していない | SetColumnHeaders を呼び出す |
| 件数が更新されない | lblCount.Text を変更していない | DisplayEmployees 内で更新する |
| 選択行を取得できない | 行が選択されていない | CurrentRow == null を確認する |
DataBoundItem がnullになる | DataSourceが正しく設定されていない | DataSource に List<Employee> を設定する |
| 検索しても結果が変わらない | 検索後に再表示していない | DisplayEmployees(results) を呼ぶ |
| 検索後に全件に戻せない | 元データを保持していない | _employees に全件データを保持する |
| 給与未設定の検索が分からない | decimal? に慣れていない | employee.Salary == null で判定する |
学んだことチェック
Section titled “学んだことチェック”次の項目について、自分で説明できるか確認してください。
-
DataGridViewとは何かを説明できる -
ListBoxとDataGridViewの違いを説明できる - フォームに
DataGridViewを配置できる -
DataGridViewのNameを設定できる -
DataSourceにList<Employee>を設定できる -
Employeeのプロパティが列として表示されることを説明できる - 列見出しを変更できる
-
ReadOnly、SelectionModeなどの基本設定ができる - 選択行の
DataBoundItemからEmployeeを取得できる - LINQで検索条件に合う社員を抽出できる
- 検索結果をDataGridViewに再表示できる
- DBから取得した一覧も同じようにDataGridViewへ表示できることを説明できる
研修の進め方によっては、隣の人または近くの人と説明確認を行います。
次の内容を、自分の言葉で説明してください。
ListBoxとDataGridViewは何が違いますか。DataGridView.DataSourceには何を設定しますか。List<Employee>をDataGridViewに設定すると、何が列として表示されますか。dgvEmployees.DataSource = null;を一度行う理由は何ですか。CurrentRowは何を表しますか。DataBoundItemは何を表しますか。- 検索後に全件表示へ戻すために、なぜ
_employeesが必要ですか。 - 次章で、サンプルデータは何に置き換わる予定ですか。
この章の演習課題に取り組みます。
制限時間は 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 クラスを作成してください。
プロパティ:
| プロパティ名 | 型 |
|---|---|
EmployeeId | int |
EmployeeName | string |
DepartmentName | string |
HireDate | DateTime |
Salary | decimal? |
条件:
Employee.csを作成する- 文字列プロパティには初期値
""を設定する Salaryはdecimal?にする
課題22-3 DataGridViewを配置する
Section titled “課題22-3 DataGridViewを配置する”フォームにDataGridViewを配置してください。
配置するコントロール:
| コントロール | Name | Text |
|---|---|---|
Button | btnLoad | 一覧表示 |
DataGridView | dgvEmployees | なし |
Label | lblCount | 件数:0件 |
条件:
dgvEmployeesのReadOnlyをTrueにするAllowUserToAddRowsをFalseにするSelectionModeをFullRowSelectにするMultiSelectをFalseにする
課題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を取得する- 何も選択されていない場合はメッセージを表示する
課題22-7 社員名で検索する
Section titled “課題22-7 社員名で検索する”社員名にキーワードを含む社員だけを表示してください。
条件:
txtKeywordを追加するbtnSearchを追加するWhereとContainsを使う- 検索結果をDataGridViewに表示する
- 0件の場合はメッセージを表示する
課題22-8 部署名も検索対象にする
Section titled “課題22-8 部署名も検索対象にする”社員名だけでなく、部署名も検索対象にしてください。
条件:
- 社員名または部署名にキーワードを含む社員を表示する
||を使う- 検索結果件数を表示する
課題22-9 全件表示に戻す
Section titled “課題22-9 全件表示に戻す”検索条件をクリアして、全件表示に戻すボタンを作成してください。
条件:
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への提出
Section titled “Gitへの提出”課題が終わったら、できたところまでをGitに提出します。
git statusgit add .git commit -m "Chapter22 DataGridViewで一覧表示"git pushGitの操作でエラーが出た場合は、自己判断で同じ操作を繰り返さず、講師に確認してください。
提出前チェックリスト
Section titled “提出前チェックリスト”- Windowsフォームアプリを作成できている
-
Employeeクラスを作成している -
DataGridViewを配置している -
DataGridViewのNameをdgvEmployeesにしている -
DataSourceにList<Employee>を設定している - サンプルデータを一覧表示できている
- 件数を表示できている
- 列見出しを日本語に変更している
- 選択行の社員情報を取得できている
- LINQで検索できている
- 検索結果を再表示できている
- 全件表示に戻せる
- インデントが整っている
- Gitにcommitしている
- Gitにpushしている
この章のまとめ
Section titled “この章のまとめ”この章では、Windowsフォームアプリで DataGridView を使って一覧を表示する方法を学習しました。
この章で学んだ主な内容は次の通りです。
DataGridViewは表形式でデータを表示するためのコントロールであるListBoxは単純な一覧、DataGridViewは複数列の一覧に向いているDataGridView.DataSourceにList<T>を設定すると一覧表示できるEmployeeクラスのプロパティがDataGridViewの列として表示されるHeaderTextを変更すると、列見出しを日本語にできるReadOnlyをtrueにすると、画面上で直接編集させないようにできるCurrentRowで現在選択されている行を取得できるDataBoundItemから、選択行に対応する元のオブジェクトを取得できる- LINQを使うと、社員名や部署名で検索・絞り込みができる
- 検索結果も
DataSourceに設定し直すことで再表示できる - 元データを
_employeesに保持しておくと、検索後に全件表示へ戻せる - DBから取得したデータも、
List<T>にすれば同じようにDataGridViewへ表示できる
次章では、WindowsフォームアプリからOracle Databaseを利用する ことを学習します。
この章ではサンプルデータをDataGridViewに表示しました。
次章では、Oracle Databaseの employees 表と departments 表から取得した社員一覧を、DataGridViewに表示します。