学習記事一覧 · 電話帳

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

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

今回は学習用として、電話帳アプリを作ります。

このチュートリアルでは、

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

という流れを学びます。


今日作るもの

画面はシンプルです。

名前一覧(ListBox)

名前をクリック

電話番号を表示

例:田中をクリック → 090-1234-5678 と表示されます。


電話帳データの形式

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

data.txt

名前,電話番号

の形式で保存します。

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

電話帳1件を表すクラス

まず電話帳1件を表すクラスを作ります。

PhoneData.cs

class PhoneData
{
    public string Name;
    public string PhoneNumber;
}

ここでは NamePhoneNumber の2つの情報を持たせています。


Listで電話帳を管理する

電話帳は複数のデータを持つので List を使います。

List<PhoneData> phoneBook;

これは PhoneData の集合になります。


フォームのコード

Form1.cs

(サンプルの @"..\..\data.txt" 部分は、教科書に合わせています。"data.txt" で取得できるようにしている場合はそれに合わせてください)

using System;
using System.Collections.Generic;
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()
        {
            using (System.IO.StreamReader file =
                   new System.IO.StreamReader(@"..\..\data.txt"))
            {
                while (!file.EndOfStream)
                {
                    string line = file.ReadLine();
                    string[] data = line.Split(',');

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

                    phoneBook.Add(phone);
                }
            }
        }

        private void NameSelected(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 の選択イベントで NameSelected が呼ばれます。

選択された名前

string name = nameList.Text;

電話帳を検索

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

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


Dictionaryとの違い

Dictionary なら phoneBook[name] で取得できます。

しかし今回は List + クラス で作っています。

理由は オブジェクト指向を理解するため です。


List + クラスのメリット

電話帳は将来、

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

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

その場合、Dictionary<string, string> では対応できません。

しかし class PhoneData なら簡単に拡張できます。


プログラムの流れ

フォーム起動

ReadFromFile() で data.txt を読み込み

ListBox に名前を表示

ユーザーが名前をクリック

NameSelected が呼ばれる

一致する PhoneData を検索

電話番号を Label に表示

重要ポイント

  • ファイル読み込み:StreamReader で1行ずつ読み、Split で分割
  • List の使い方:複数の PhoneData を管理
  • クラスを使ったデータ管理:拡張しやすい構造
  • WinForms のイベント:ListBox の選択変更で NameSelected が呼ばれる

まとめ

今回学んだこと

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

小さなアプリですが、実際のアプリ開発の基本がたくさん含まれています。