前回までで、WinFormsアプリ開発の基礎的な内容を学びました。今回からデータ操作の実践シリーズがスタートします。
次のような機能をもつ簡易な社員データ管理アプリを作ってみましょう。今回は①、②を作ります。
- CSVファイルの読み込み(←今回作る)
- データの一覧表示(←今回作る)
- データ検索/フィルタリング
- CSVファイルへの保存
- Excel出力
以下は、最終的なアプリ画面の完成イメージです。

今回は以下の内容を学びます。
- WinFormsアプリ開発におけるプロジェクトのフォルダ構成
- CSVファイルの読み込み
- DataGridViewでデータを表示する
以下のような方におすすめです。
- 表形式のデータを読み込んでアプリで表示したい方
- CSVファイルの入出力に興味のある方
- DataGridViewの使い方を知りたい方
実際の業務で、表形式のデータを扱うことは非常に多いので役立つ内容かと思います。
また、アプリ開発の進め方・考え方についても都度紹介します。
演習コード一式はGitHubに置いてあります。
WinFormsアプリ開発が初めてという方は、まずWinForms実践入門編の第1~4回で解説している基礎(フォーム、コントロールなど)からご覧ください。
YouTubeの動画は以下です。
演習:CSVでデータを読み込み表示
今回は、CSVで社員データを読み込みDataGridViewで表示する部分を作ります。以下の手順で作ります。
- 手順1:プロジェクトを作成しフォルダを整理
- 手順2:社員データを定義(Employee.cs)
- 手順3:CSV読み込み処理を作成(CsvService.cs)
- 手順4:画面にCSV読み込み機能追加(MainForm.cs)
手順1:プロジェクトを作成しフォルダを整理
最初にWinFormsアプリとして「EmployeeManager」という名前の新規プロジェクトを作成しましょう。
そしてフォルダ・ファイル構成を整理し、必要なコードファイルも追加しましょう。今回は小さなアプリなので、以下のような簡単なフォルダ構成にします。
- Forms:画面
- Models:データの定義
- Services:アプリのロジック
以下のように整理します。

以下の手順で整理します。
- 1. EmployeeManagerプロジェクト配下にForms、Models、Servicesというフォルダを追加
- 2. Models配下にEmployee.cs、Services配下にCsvService.csを追加
- 3. Form1.csのファイル名をMainForm.csにした後、Forms配下へ移動
ソリューションエクスプローラで、右クリックメニューで「追加>新しいフォルダ」や「追加>クラス」でフォルダ・コードを追加しましょう。
VisualStudio上でForm1.csのファイル名を変えると、リファクタリングの機能により自動でクラス名も変わります。
また、Forms配下へ移動したときには名前空間について自動調整するかどうかの確認ダイアログがでるので、「はい」を選び自動調整してもらいましょう。

C#プロジェクトではフォルダ構成と名前空間は対応づけるようにするのが基本です。
名前空間・フォルダの整理については以下の記事も参考にしてください。

これで具体的にアプリを作り始める準備が整ったね!
最初にフォルダ構成を考えるのが大事なんだね!
そうですね。最初におおまかに整理しておくとよいです。また、アプリの規模が大きくなってきたら都度見直すことも大事ですね。
また、WinFormsアプリに限りませんが、開発をすすめるうえでGitによるバージョン管理を導入しておくこともおすすめです。以下も参考にしてください。

コードをいろいろ修正していて「急に正常動作しなくなり元に戻せなった(泣)」ということはありませんか?
Gitで適切にバージョン管理することで、そのようなことを防げます!
手順2:社員データを定義
以下のようにEmployee.csでクラス定義しましょう。
namespace EmployeeManager.Models
{
public class Employee
{
public string Id { get; set; }
public string Name { get; set; }
public string Department { get; set; }
public DateTime JoinDate { get; set; }
public Employee(string id, string name, string department, DateTime joinDate)
{
Id = id;
Name = name;
Department = department;
JoinDate = joinDate;
}
// CSVの1行から社員インスタンスを作成
public static Employee FromCsv(string csvLine)
{
string[] values = csvLine.Split(',');
return new Employee(
values[ 0 ], values[ 1 ], values[ 2 ], DateTime.Parse(values[ 3 ])
);
}
}
}
社員はID、名前、部署、入社日のプロパティを持ちます。また、CSVファイルの1行(文字列)から社員インスタンスを生成するメソッドも定義しておきます。
手順3:CSV読み込み処理を作成
CsvServiceクラスを以下のように定義します。
using System.Text;
using EmployeeManager.Models;
namespace EmployeeManager.Services
{
public class CsvService
{
public List<Employee> ReadCsv(string filePath)
{
var employees = new List<Employee>();
using (var reader = new StreamReader(filePath, true))
{
// ヘッダーをスキップ
reader.ReadLine();
string line;
while ((line = reader.ReadLine()) != null)
{
if (!string.IsNullOrWhiteSpace(line))
{
employees.Add(Employee.FromCsv(line));
}
}
}
return employees;
}
}
}
今回はシンプルにファイルから1行ずつ読み込み、そこから社員インスタンスを作っています。
シンプルなCSVデータで少量の場合は、今回のような基本的な方法でも大丈夫でしょう。
CSVデータに特殊文字(カンマやダブルクォート)が含まれる場合や、大量のデータを扱う場合はCSVHelperなどのライブラリの使用を推奨します。
CSV用ライブラリの使い方については以下も参考にしてください。

手順4:画面にCSV読み込み機能追加
最後に画面(MainForm.cs)を作りましょう。
画面の「見た目」を作る
まず以下のようにコントロールを配置し、プロパティの設定をしましょう。
- フォーム
- Text:”社員情報管理”
- CSV読み込みボタン(Button)
- Name:loadCsvButton
- Text:”CSVファイル読込”
- 社員データ表示データグリッドビュー(DataGridView)
- Name:employeeDataGridView
- Anchor:AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right
- ReadOnly:true
配置すると以下のような画面構成になります。

Anchorプロパティを設定することで、フォームのサイズが変更されても適切に表示領域が調整されるんだね!
画面の「動作」を作る
次にイベントを作成します。MainForm.csを以下のように修正します。
using EmployeeManager.Services;
namespace EmployeeManager.Forms
{
public partial class MainForm : Form
{
private readonly CsvService _csvService;
public MainForm()
{
InitializeComponent();
_csvService = new CsvService();
}
private void loadCsvButton_Click(object sender, EventArgs e)
{
using (OpenFileDialog dialog = new OpenFileDialog())
{
dialog.Filter = "CSVファイル|*.csv";
if (dialog.ShowDialog() == DialogResult.OK)
{
try
{
var employees = _csvService.ReadCsv(dialog.FileName);
employeeDataGridView.DataSource = employees;
MessageBox.Show("CSVファイルを読み込みました。", "成功",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show($"エラーが発生しました:{ex.Message}", "エラー",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
}
}
ユーザがボタンをクリックすると、CSVファイル選択ダイアログが開き、選択されたファイルのデータをDataGridViewに表示します。
OpenFileDialog
OpenFileDialogはファイル選択用の標準ダイアログを表示するためのモーダルフォームです。
Filterプロパティで表示するファイルの種類を制限でき、今回は「CSVファイル|*.csv」と指定することでCSVファイルのみを選択可能にしています。
ShowDialog()メソッドでダイアログを表示し、ユーザがファイルを選択してOKボタンをクリックするとDialogResult.OKが返されます。
DataGridView
DataGridViewは表形式のデータを表示するための強力なコントロールです。
DataSourceプロパティにListやDataTableなどのデータソースを設定することで、自動的にデータを表形式で表示してくれます。
今回はList<Employee>をDataSourceに設定することで、Employeeクラスの各プロパティが列として表示されます。
これでCSVファイルを読み込んで表示する基本的な機能ができたね!
DataGridViewは色々な機能があるのですが、今回はまずシンプルに表示するだけです。また別の機会に他の機能も紹介しますね!
アプリを実行
サンプルとなるCSVファイルを作ります。UTF8形式で保存しましょう。以下は例です。
社員ID,氏名,部署,入社日
EMP001,山田太郎,営業部,2020/04/01
EMP002,鈴木花子,総務部,2019/04/01
EMP003,佐藤健一,開発部,2021/04/01
EMP004,田中美咲,営業部,2022/04/01
EMP005,伊藤博,人事部,2018/04/01
EMP006,渡辺明子,開発部,2020/10/01
EMP007,中村剛,営業部,2021/07/01
EMP008,小林優子,総務部,2019/10/01
EMP009,加藤正樹,開発部,2022/01/01
EMP010,吉田真理,人事部,2020/07/01
UTF8形式をエクセルで編集する場合、CSVファイルを「UTF8 BOM付き」にしましょう。UTF8(BOM無し)だと文字化けします。
作ったアプリをデバッグ実行してみましょう。
CSV読込ボタンを押すと、ファイルオープンのためのモーダルダイアログが開きますので、読み込むCSVファイルを選びましょう。

CSVが読み込まれて以下のように表示されます。

CSVを読み込んでデータグリッドで表示できた!意外と簡単だね!
OpenFileDialog、DataGridViewなど便利な部品が揃っているので、それを組み合わせると効率よくアプリ開発ができますね。
ちなみにですが、今回使ったサンプルデータはChatGPTに作ってもらいました。テストデータ作成を生成AIに任せるととても効率的です。
ChatGPT活用はアプリ開発初心者の方にもおすすめです。以下の記事も参考にしてください。

まとめ
本記事では、WinFormsアプリを使った社員データ管理システムの基本機能の実装について学びました。
プロジェクト構成について、Forms(画面)、Models(データ定義)、Services(ロジック)という基本的なフォルダ構成を学び、コードの整理方法を理解しました。
CSVファイルの取り扱いでは、StreamReaderを使用した基本的なCSV読み込み方法を実装し、データをEmployeeクラスのインスタンスに変換する方法を学びました。
DataGridViewの活用では、CSVから読み込んだデータをDataSourceプロパティに設定することで、簡単にデータを表形式で表示できることを学びました。
この基本実装を土台として、今後はデータの検索/フィルタリング機能、CSVファイルへの保存機能、Excel出力機能などを追加していく予定です。
引き続き、一緒にC# WinFormsアプリ開発を学んでいきましょう!