Skip to content

第22章 作って覚えるで学ぶCSV読み書きとDataGridView

この章では、書籍「作って覚える Visual C# 2022 デスクトップアプリ超入門」の Chapter 7.1「『CSVの読み書きアプリ』の作成」(CsvReadWrite)を参照しながら、Windows フォームアプリで 表形式のデータ を扱う方法を学習します。

これまでは「テキストボックスに入力 → 計算結果を表示」のような 1 件単位 のデータを扱ってきました。 この章では、社員一覧のような 複数行・複数列 のデータを扱います。

社員ID,社員名,部署名
1001,山田二郎,総務
1002,佐藤昭夫,営業
1003,山口洋子,開発

このような 表形式データ を、CSV ファイルから読み込み、DataGridView という新しいコントロールに表示します。

重要:この章は次章以降への橋渡し

第 23 章以降では、CSV ファイルの代わりに SQLServer からデータを取得して同じく DataGridView に表示します。 CSV と DB は「データの取得元」が違うだけで、画面表示の仕組み(DataTable を介して DataGridView に出す部分)はほぼ共通 です。 第 17 章で学んだ SqlConnection / SqlCommand を、ここで身に付ける DataTable / DataGridView と組み合わせるのが、次章以降の Windows フォーム社員管理アプリです。

書籍に手順がすべて書かれているので、書籍を手元に開いて手を動かしながら進めてください。 本テキストでは、次章以降の SQLServer 連携につながる視点で補足を入れます。


範囲内容
Chapter 7.1「CSV の読み書きアプリ」の作成(CsvReadWrite)

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

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

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

  • CSV ファイルがどんな形式かを説明できる
  • DataGridView コントロールを画面に配置できる
  • DataTable の役割を説明できる(表形式データの「入れ物」)
  • CSV → DataTableDataGridView の流れを説明できる
  • DataGridView.DataSource にデータを紐づけられる
  • OpenFileDialogSaveFileDialog の存在と役割を知っている
  • NuGet で Csv ライブラリを追加できる
  • 次章以降の SQLServer 連携との対応関係 を説明できる

項目内容
開発環境Visual Studio 2022
プロジェクト種類Windows フォーム アプリ
対象フレームワーク.NET 8
プロジェクト名CsvReadWrite(書籍と合わせる)
追加 NuGet パッケージCsv(書籍 7.1 で指示あり)

csproj の Nullable は disable に変更してください(第 1 章「1-1」参照)


  • 第 21 章を Git に提出済みである
  • 書籍 Chapter 7.1 のページを開ける状態である
  • NuGet でパッケージを追加できる(第 17 章で Microsoft.Data.SqlClient を追加した経験あり)

CSVComma-Separated Values の略で、カンマで区切られた表形式のテキストファイル です。

社員ID,社員名,部署名
1001,山田二郎,総務
1002,佐藤昭夫,営業
1003,山口洋子,開発

このテキストを表として見ると:

社員ID社員名部署名
1001山田二郎総務
1002佐藤昭夫営業
1003山口洋子開発

1 行目を ヘッダー行(列名)、2 行目以降を データ行 として扱うのが一般的です。 Excel でも開ける汎用フォーマットなので、システム間でデータを受け渡しする形式としてよく使われます。


DataGridView は、表形式のデータを画面に表示する ためのコントロールです。 今まで使ってきた LabelTextBoxButton などと同じく、ツールボックスから配置します。

用途例内容
社員一覧の表示全社員を行に並べて表示
検索結果の表示SQL の SELECT 結果や CSV の中身
編集可能な表セルを直接編集する画面

次章以降で扱う SQLServer の SELECT 結果も、DataTable 経由で DataGridView に表示できます。 DataGridView は Forms 編の主役級コントロール です。


22-3 DataTable は表形式データの「入れ物」

Section titled “22-3 DataTable は表形式データの「入れ物」”

DataTable は、プログラムの中で表形式データを扱うための汎用クラス です。列と行の集まりとして表を表現でき、DataGridViewDataSource に直接代入できる点が特徴です。

この章では、CSV ファイルから読み込んだデータDataTable に詰めて、DataGridView に表示します。

CSV ファイル SQLServer(次章以降)
↓ ファイル読み込み ↓ SELECT + DataReader
DataTable ← 表形式の入れ物
↓ DataSource に設定
DataGridView ← 画面の表

DataTable は「データの入れ物」、DataGridView は「画面の表」 と覚えましょう。 入れ物と表示部品が分かれているおかげで、データ源が CSV でも DB でも、同じ画面で扱えます。


書籍 7.1 で作る CsvReadWrite の流れを、研修向けに整理します。 具体的な配置・手順は書籍を参照 してください。

コントロール役割
TextBox(入力 CSV ファイル名)読み込み対象のファイルパスを表示
Button(CSV 取得)クリックでファイル選択 → 読み込み
DataGridView読み込んだ CSV 内容を表として表示
Button(CSV 出力)クリックでファイル名を選択 → 保存
TextBox(出力 CSV ファイル名)保存先のファイルパスを表示
OpenFileDialog(非表示)ファイル選択ダイアログ
SaveFileDialog(非表示)ファイル保存ダイアログ

OpenFileDialogSaveFileDialog は、Timer と同じく 画面に表示されないコンポーネント(第 20 章)です。 ツールボックスから配置すると、コンポーネントトレイに置かれます。

読み込み(buttonCsvRead_Click):

1. openFileDialogCsv.ShowDialog() でファイル選択ダイアログを表示
2. ユーザーが OK を押したら、選択されたファイル名を取得
3. File.ReadAllText でファイル内容を文字列として読み込む(UTF-16)
4. CsvReader.ReadFromText で行ごとに分解
5. ヘッダー行から DataTable の列を作る
6. データ行を DataTable.Rows.Add で追加
7. DataGridView.DataSource = dataTable で画面に表示

保存(buttonCsvWrite_Click):

1. saveFileDialogCsv.ShowDialog() で保存先ダイアログを表示
2. ユーザーが OK を押したら、保存先ファイル名を取得
3. DataTable から列名(header)とデータ(newLine)を取り出す
4. CsvWriter.WriteToText で CSV 文字列を組み立てる
5. File.WriteAllText でファイルに保存(UTF-16)

具体的なコードは書籍 7.1 を参照してください。


22-5 研修固有の補足(深入りしないポイント)

Section titled “22-5 研修固有の補足(深入りしないポイント)”

書籍 7.1 のサンプルには、研修の現段階では 深追いしなくてよい部分 があります。 理解できる範囲で確認しつつ、深入りせずに先へ進んで構いません。

部分説明研修での扱い
using Csv;NuGet ライブラリの名前空間NuGet で追加すれば使える、と覚える
Encoding.GetEncoding("utf-16")文字コード指定(日本語対応)「日本語を扱うのに必要」程度で OK
string[][] newLine = ...二次元配列で CSV を組み立て書籍のコードを実行する範囲で OK
CsvReader.ReadFromText外部ライブラリのメソッドライブラリの使い方は書籍を参照

C# の基本(intstring、メソッド、DataTable)は理解できるはずです。 ライブラリ固有の細かい使い方 は、必要になったときに調べられればよい、というスタンスで進めましょう。


22-6 DataTable と List<T> の使い分け

Section titled “22-6 DataTable と List<T> の使い分け”

表形式データの扱いには、DataTableList<T> の 2 つのアプローチがあります。

方法データの形強み
DataTable(この章)表として扱うDataGridView への表示が簡単、列構造が動的でも対応可
List<Employee>クラスの集まりで扱うLINQ で操作しやすい、ロジックを書きやすい(第 12 章を参照)

どちらにも長所があります。

画面に「ぱっと表示する」だけなら → DataTable
ロジックで絞り込み・並び替え・集計 → List<Employee>
DataGridView に表示する → どちらでも可

書籍 7.1 では DataTable を使う形になっています。 本研修の後半(第 23 章以降)では、両方の使い方をシーンに応じて使い分けます。


22-7 次章以降の DB 連携への橋渡し

Section titled “22-7 次章以降の DB 連携への橋渡し”

この章で扱う CSV と、次章以降の SQLServer 連携の 対応関係 を整理しておきます。

観点この章(CSV)次章以降(SQLServer)
データ源CSV ファイルSQLServer の TrainingDB
読み込みFile.ReadAllText + CsvReaderSqlCommand + SqlDataReader
入れ物DataTableDataTable(または List<Employee>)
画面表示DataGridView.DataSource同じく DataGridView.DataSource
エラーファイル不存在・形式不正接続失敗・SQL エラー(SqlException)
保存File.WriteAllText + CsvWriterINSERT / UPDATE / DELETE(第25章)

画面表示の仕組みは CSV でも DB でも同じ であることが分かります。 この章で DataGridView への表示パターンを身に付けておくと、次章以降の SQLServer 連携がスムーズに入ります。


つまずき原因対応
using Csv; で赤波線NuGet パッケージ未追加Csv パッケージを NuGet で追加
日本語が文字化けする文字コードが合っていない書籍どおり Encoding.GetEncoding("utf-16") を使う
DataGridView に何も表示されないDataSource への代入が抜けているdataGridViewCsv.DataSource = dataTable; を確認
2 回目の読み込みで列が増える前回の Columns が残っているdataTable.Columns.Clear() / dataTable.Clear() を入れる(書籍どおり)
ファイル選択ダイアログが出ないShowDialog() を呼んでいないif (openFileDialogCsv.ShowDialog() == DialogResult.OK) { ... }
OpenFileDialog/SaveFileDialog が画面に見えない画面に表示されないコンポーネントコンポーネントトレイにあれば OK(第 20 章 Timer と同様)
列の順番がおかしいCSV ヘッダーの順序と一致CSV のヘッダー行を確認

  • CSV ファイルの形式(カンマ区切り、ヘッダー行とデータ行)を説明できる
  • DataGridView を画面に配置できる
  • DataTable の役割を説明できる
  • CSV → DataTableDataGridView の流れを説明できる
  • DataGridView.DataSourceDataTable を設定して表示できる
  • OpenFileDialogSaveFileDialog がコンポーネントトレイに置かれることを説明できる
  • NuGet で Csv パッケージを追加できた
  • CSV からの読み込みと、次章以降の DB からの取得とで、DataTable の役割が共通であることを説明できる

研修の進め方によっては、隣の人またはチーム内で説明確認を行います。

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

  1. CSV ファイルとは何ですか。
  2. DataGridView は何のためのコントロールですか。
  3. DataTable の役割は何ですか。
  4. CSV を DataGridView に表示するまでの流れを、3 ステップで説明してください。
  5. OpenFileDialog が画面に表示されないのはなぜですか。
  6. この章で学んだことは、次章以降の SQLServer 連携とどうつながりますか。

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

制限時間は 120 分 です。

書籍 Chapter 7.1 を参照しながら作業します。 画面操作・コードの細かな手順は書籍に書かれているので、書籍を手元に開いて進めてください。


課題 22-1 書籍 Chapter 7.1 を参照して CsvReadWrite アプリを完成させる

Section titled “課題 22-1 書籍 Chapter 7.1 を参照して CsvReadWrite アプリを完成させる”

書籍 7.1 を参照して、CsvReadWrite プロジェクトを完成させてください。

仕様(書籍と同じ)

  • プロジェクト名:CsvReadWrite
  • NuGet で Csv パッケージを追加
  • フォームに次のコントロールを配置:
    • TextBox(入力 CSV ファイル名)
    • Button(CSV 取得)
    • DataGridView(Name:dataGridViewCsv)
    • Button(CSV 出力)
    • TextBox(出力 CSV ファイル名)
    • OpenFileDialogSaveFileDialog
  • 「CSV 取得」ボタン:ダイアログでファイル選択 → DataGridView に内容を表示
  • 「CSV 出力」ボタン:ダイアログで保存先指定 → DataGridView の内容を CSV に保存

動作確認用 CSV(あらかじめテキストエディタで作成)

社員ID,社員名,部署名
1001,山田二郎,総務
1002,佐藤昭夫,営業
1003,山口洋子,開発
1004,田中浩介,マーケティング
1005,加藤昭彦,品質管理

ファイル名は employees.csv などにして、UTF-16 で保存してください(書籍の指示に従う)。

確認すること

  • CSV を読み込んで DataGridView に表示できる
  • 別ファイルとして CSV を保存できる
  • csproj が <Nullable>disable</Nullable>

課題 22-2 CSV・DataTable・DataGridView の関係をコードで追う

Section titled “課題 22-2 CSV・DataTable・DataGridView の関係をコードで追う”

完成した CsvReadWrite のコードを開いて、DataTable がどのように使われているか を確認してください。

確認の手順

  1. buttonCsvRead_Click メソッドを開く
  2. DataTable(Columns)が追加されている行を探す
  3. DataTable(Rows)が追加されている行を探す
  4. dataGridViewCsv.DataSource = dataTable; の行を探す
  5. それぞれの行の役割を、自分の言葉で説明できるようにする

おすすめ:第 21 章のデバッグ操作で動きを観察

  • 各処理の前後にブレークポイントを置く
  • ステップ実行で dataTable.Columns.CountdataTable.Rows.Count の変化を観察
  • どのタイミングで DataGridView に表示されるかを目で見る

確認すること

  • DataTable の列追加・行追加の処理場所が分かる
  • DataSource への代入で表示が更新されることを確認した
  • 次章以降で扱う DB からの取得と、この章の CSV からの取得との共通点を説明できる

課題 22-3 不完全な CSV でアプリの動きを観察する

Section titled “課題 22-3 不完全な CSV でアプリの動きを観察する”

意図的に 不完全な CSV ファイル を用意し、アプリの挙動を観察してください。 原因と対応案を自分で考えます。

試してほしいパターン(どれか 2 つ以上)

不完全パターン
ヘッダーがない1 行目からいきなりデータ
列数が足りない行一部の行のカンマ数が少ない
空行が混じるデータ行の間に空行
ファイルが存在しない削除した状態で「取得」ボタン
文字コードが違うUTF-8 で保存した CSV

確認すること

  • どのような表示や例外が出るかを観察できた
  • エラーの原因を自分の言葉で説明できる
  • 第 15 章の try-catch を使ってアプリが落ちないようにできる(コードの追加は任意)

補足

実務では「読み込むファイルが常に正しいとは限らない」のが普通です。 エラー時の挙動を意識しておくことが大切です(細かな対応は後の章でも扱います)。


課題 22-4 CSV から DB への置き換えを構想する(座学)

Section titled “課題 22-4 CSV から DB への置き換えを構想する(座学)”

次章以降では、CSV ファイルの代わりに SQLServer の TrainingDB からデータを取得して DataGridView に表示します。 具体的なコードを書く前に、どこをどう置き換えればよいか を考えてみてください。

考えるテンプレート

この章で書いた処理DB 版で何に置き換える?
File.ReadAllText(...)(例:SqlConnection.Open() + ?)
CsvReader.ReadFromText(...)(例:?)
dataTable.Columns.Add(...) で列追加(例:?)
dataTable.Rows.Add(...) で行追加(例:?)
dataGridViewCsv.DataSource = dataTable;(例:?)
File.WriteAllText(...)(CSV 保存)(例:?)

ヒント:第 17 章で学んだ DB アクセスを思い出す

  • SqlConnection / SqlCommand / SqlDataReader / DataTable.Load
  • 第 17 章では ExecuteScalar で 1 つの値を取得したが、複数行を取りたい場合は ExecuteReader を使う

確認すること

  • CSV と DB の対応関係を表で書ける
  • 「画面表示の仕組み(DataGridView 部分)はほぼ同じ」と説明できる
  • 第 17 章で学んだ DB アクセスの知識が、次章以降でどう活きるかを想像できる

この課題はコードを書きません。 次章以降に何を作るか をイメージするのが目的です。


  • プロジェクト名が CsvReadWrite
  • csproj が <Nullable>disable</Nullable>
  • Csv NuGet パッケージが追加されている
  • CSV 読み込み → DataGridView 表示が動く
  • CSV 保存ができる
  • 動作確認用の CSV ファイル(employees.csv など)を用意した
  • binobj.vs フォルダが Git 管理に入っていない
  • CSV ファイル自体を Git に含めるかは講師の指示に従う

Terminal window
git status
git add .
git commit -m "第22章 CSV読み書きとDataGridView"
git push

Git の詳しい操作は、付録 C「Git のインストールと提出ルール」 を参照してください。


  • CSV は カンマ区切り で表形式データを表すテキストファイル
  • DataGridView表形式データを画面に表示する ためのコントロール
  • DataTableプログラム内で表形式データを扱う入れ物(第 17 章と共通)
  • 流れ:CSV → DataTableDataGridView
  • DataGridView.DataSource = dataTable; で画面に表が表示される
  • OpenFileDialogSaveFileDialog は画面に表示されないコンポーネント
  • NuGet Csv ライブラリを使うと CSV を扱いやすくなる
  • 画面表示の仕組み(DataGridView)は、データ源が CSV でも DB でも共通

次章からは、本研修オリジナルのコンテンツに入ります。

第 23 章では、この章で作った CSV アプリのデータ源を SQLServer の TrainingDB に置き換える 形で、Windows フォーム社員管理アプリの一覧表示を作ります。 第 17 章で学んだ SqlConnectionSqlCommand に、本章で身に付けた DataTableDataGridView を組み合わせて、employees テーブルの内容を画面に表示します。

「画面の見た目はほぼ同じ、データ源が CSV から DB に変わるだけ」── これがインターフェイス(第 14 章)で学んだ 実装の差し替え の考え方の実演でもあります。