WinForms

【C#/WinForms実践入門編(5)】社員管理アプリを作る ~CSV読み込みとDataGridView表示~

前回までで、WinFormsアプリ開発の基礎的な内容を学びました。今回からデータ操作の実践シリーズがスタートします。

次のような機能をもつ簡易な社員データ管理アプリを作ってみましょう。今回は①、②を作ります。

  1. CSVファイルの読み込み(←今回作る)
  2. データの一覧表示(←今回作る)
  3. データ検索/フィルタリング
  4. CSVファイルへの保存
  5. 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#プロジェクトではフォルダ構成と名前空間は対応づけるようにするのが基本です。

名前空間・フォルダの整理については以下の記事も参考にしてください。

C#入門編(11)名前空間とファイル分割 ~Visual Studioでコードを整理整頓~ プログラムが規模を増すにつれ、その管理が徐々に難しくなってくると思います。 これは、プログラム内のクラスやメソッドが増え、それら...
プロ美

これで具体的にアプリを作り始める準備が整ったね!

最初にフォルダ構成を考えるのが大事なんだね!

プロ太

そうですね。最初におおまかに整理しておくとよいです。また、アプリの規模が大きくなってきたら都度見直すことも大事ですね。

また、WinFormsアプリに限りませんが、開発をすすめるうえでGitによるバージョン管理を導入しておくこともおすすめです。以下も参考にしてください。

【C#、Blazor】Webアプリ開発入門編(3)Gitでバージョン管理 ~Gitの基本的な使い方を学ぶ~【ASP.NET Core】 今回はWebアプリ開発を効率よく行う上で不可欠となる「バージョン管理ツール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用ライブラリの使い方については以下も参考にしてください。

C#入門編(18)NuGetパッケージの使い方 ~CSVファイルを読み込む~【Visual Studio+nuget】 実践的なアプリ開発では、他人が作った既存部品をいかにうまく使うかがキモになります。 だいたいのアプリ開発は以下のイメージです。 ...

手順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活用はアプリ開発初心者の方にもおすすめです。以下の記事も参考にしてください。

プログラミング初心者のためのチャット型AI活用ガイド【ChatGPT入門】 プログラミング学習において、ChatGPTなどのチャット型AIは非常に便利なツールです。 しかし、プログラミング初心者がAIを使...

まとめ

本記事では、WinFormsアプリを使った社員データ管理システムの基本機能の実装について学びました。

プロジェクト構成について、Forms(画面)、Models(データ定義)、Services(ロジック)という基本的なフォルダ構成を学び、コードの整理方法を理解しました。

CSVファイルの取り扱いでは、StreamReaderを使用した基本的なCSV読み込み方法を実装し、データをEmployeeクラスのインスタンスに変換する方法を学びました。

DataGridViewの活用では、CSVから読み込んだデータをDataSourceプロパティに設定することで、簡単にデータを表形式で表示できることを学びました。

この基本実装を土台として、今後はデータの検索/フィルタリング機能、CSVファイルへの保存機能、Excel出力機能などを追加していく予定です。

プロ太

引き続き、一緒にC# WinFormsアプリ開発を学んでいきましょう!

ABOUT ME
プロ太
●仕事:現在は個人事業主(メンター・情報発信等)、大手IT企業で技術者・マネージャ(15年以上)、大学の外部講師、学生時代は学習塾で非常勤講師(約4年間) ●博士(工学)の学位取得 ●高校生の頃に独学で始め、プログラミング歴20年以上 ●言語:C# 、Java、C/C++、Python、JavaScript/TypeScript等 ●分野:Webアプリ、テスト自動化、生成AI、デバッガ、コード解析、ドメイン特化言語

ご依頼・ご相談について

プログラミング学習のご相談、お仕事のご依頼については、
こちらのお問い合わせページをご確認ください。