WinFormsで作る電話帳アプリ(Listで管理する版)

2026年9月9日

広告

Windows Forms を使うと、

簡単に デスクトップアプリケーションを作ることができます。

今回は学習用として、

電話帳アプリ

を作ります。

このチュートリアルでは

  • ファイルからデータを読み込む
  • Listでデータを管理する
  • ListBoxで名前を表示する
  • 名前を選ぶと電話番号を表示する

という流れを学びます。


プロジェクトを作る

Visual Studio で新しいプロジェクトを作ります。

  • テンプレート: Windows Forms アプリ(現在サポート中の.NET版)
  • ソリューション名: PhoneBook
  • プロジェクト名: PhoneBook

作成すると Form1 というウィンドウが表示されます。これが フォーム です。

Windowsフォームアプリのテンプレートを選び、空のフォームを作成する流れを示すイラスト

完成するアプリ

画面はシンプルです。

名前一覧(ListBox)
↓
名前をクリック
↓
電話番号を表示

例

田中
佐藤
鈴木

田中をクリック

090-1234-5678

コントロールの配置例

次の図は配置の一例です。青いラベルを参考に、プロパティウィンドウで Name を設定してください。

PhoneBookAppで使用するコントロールのForm1配置例

電話帳データの形式

今回は テキストファイルを読み込みます。

data.txt

田中,090-1111-1111
佐藤,090-2222-2222
鈴木,090-3333-3333

名前と電話番号を

名前,電話番号

の形式で保存します。

data.txt をプロジェクトに追加します。ソリューション エクスプローラーで PhoneBook プロジェクトを右クリックし、「追加」→「新しい項目」からテキストファイル data.txt を追加します。プロジェクト直下に置き、上記の形式でサンプルデータを書いて保存します。

次に、ソリューション エクスプローラーで data.txt を選び、プロパティ(F4)の「出力ディレクトリにコピー」を「新しい場合はコピーする」に設定します。これでビルド時に実行フォルダへコピーされ、Path.Combine(Application.StartupPath, “data.txt") で読み込めるようになります。


電話帳1件を表すクラス

まず

電話帳1件

を表すクラスを作ります。

PhoneData.cs

class PhoneData
{
    public string Name { get; set; } = "";
    public string PhoneNumber { get; set; } = "";
}

ここでは

  • Name
  • PhoneNumber

の2つの情報を持たせています。


Listで電話帳を管理する

電話帳は複数のデータを持つので

Listを使います。

List<PhoneData> phoneBook;

これは

PhoneData
PhoneData
PhoneData

のように

電話帳データの集合になります。


フォームのコード

Form1.cs
(ファイルパスは Path.Combine(Application.StartupPath, “data.txt") で取得します。data.txtのプロパティで「出力ディレクトリにコピー」を「新しい場合はコピーする」に設定してください)

using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;

namespace PhoneBook
{
    public partial class Form1 : Form
    {
        List<PhoneData> phoneBook;

        public Form1()
        {
            InitializeComponent();

            // 電話帳リストを作る
            phoneBook = new List<PhoneData>();

            // ファイル読み込み
            ReadFromFile();

            // 名前をListBoxに表示
            foreach (PhoneData data in phoneBook)
            {
                nameList.Items.Add(data.Name);
            }
        }

        private void ReadFromFile()
        {
            string filePath = Path.Combine(Application.StartupPath, "data.txt");
            using (StreamReader file = new StreamReader(filePath))
            {
                while (!file.EndOfStream)
                {
                    string? line = file.ReadLine();
                    if (string.IsNullOrWhiteSpace(line))
                    {
                        continue;
                    }

                    string[] data = line.Split(',');

                    PhoneData phone = new PhoneData();
                    phone.Name = data[0];
                    phone.PhoneNumber = data[1];

                    phoneBook.Add(phone);
                }
            }
        }

        private void nameList_SelectedIndexChanged(object sender, EventArgs e)
        {
            string name = nameList.Text;

            foreach (PhoneData data in phoneBook)
            {
                if (data.Name == name)
                {
                    phoneNumber.Text = data.PhoneNumber;
                    break;
                }
            }
        }
    }
}

ファイル読み込みの処理

string line = file.ReadLine();

1行読み込みます。

例

田中,090-1111-1111

Splitで分割

string[] data = line.Split(',');

結果

data[0] = 田中
data[1] = 090-1111-1111

クラスにデータを入れる

PhoneData phone = new PhoneData();
phone.Name = data[0];
phone.PhoneNumber = data[1];

Listに追加

phoneBook.Add(phone);

これで電話帳が増えていきます。


名前をクリックしたとき

ListBoxの選択イベントで

nameList_SelectedIndexChanged

が呼ばれます。


選択された名前

string name = nameList.Text;

電話帳を検索

foreach (PhoneData data in phoneBook)
{
    if (data.Name == name)
    {
        phoneNumber.Text = data.PhoneNumber;
    }
}

一致したデータを探します。


Dictionaryとの違い

Dictionaryなら

phoneBook[name]

で取得できます。

しかし今回は

List + クラス

で作っています。

理由は

オブジェクト指向を理解するため

です。


List + クラスのメリット

電話帳は将来

名前
電話番号
住所
メール
メモ

のように増えるかもしれません。

その場合

Dictionary<string,string>

では対応できません。

しかし

class PhoneData

なら簡単に拡張できます。


まとめ

今回学んだこと

  • ファイル読み込み
  • Splitによる文字列分割
  • Listの使い方
  • クラスを使ったデータ管理
  • WinFormsのイベント

小さなアプリですが、

実際のアプリ開発の基本

がたくさん含まれています。


C# WinForms 入門シリーズの目次へ戻る

訪問数 266 回, 今日の訪問数 1回

広告