第20回 登録した住所データを保存する | トニー電の.NETプログラミング講座

トニー電の.NETプログラミング講座

技術メルマガ(techmaga.com)のアメブロ準備版です。
一応、期間限定ってことで。

Hello everybody !!! 皆さん、C# programing 頑張っていますか?

皆さんと一緒に .NET プログラミングを学んでいく、「トニー電」です。今日も張り切っていきましょう。

今週のまとめとして、入力した住所データをファイルに保存してみましょう。

■保存するファイルは、XML 形式で。

本来ならば、住所データをデータベースに保存したいところなのですが、ここでは簡易的に XML 形式でコンピューターに保存してみましょう。

C# では、データを簡単に保存するために「シリアライズ」という機能があります。これを利用すると、ほとんど XML 形式を意識せずに、データをファイルに保存したり、逆にファイルからデータを復元したりできます。

まずは、住所データを纏めて扱うためのクラスを作りましょう。クラスは、C# で扱うときの肝となる文法ですが、ここでは「class」というキーワードで作る、プロパティ(値)の集まりとして作ります。

ソリューション エクスプローラーで「TonyAddressBook」プロジェクトを右クリックして、「追加」→「クラス」を選択します。

image

ファイル名を「Addrss.cs」と入力して、OK ボタンをクリックします。

できあがった、Address.cs ファイルに、Address クラスを次のように作成します。

namespace TonyAddressBook
{
    /// <summary>
    /// 住所データ
    /// </summary>
    public class Address
    {
        public string ruby { get; set; }
        public string name { get; set; }
        public string kind { get; set; }
        public string zipcode { get; set; }
        public string addrss1 { get; set; }
        public string addrss2 { get; set; }
        public string telephone { get; set; }
        public string fax { get; set; }
        public string ktai { get; set; }
        public string mail { get; set; }
    }
}

振り仮名や名前などが保存できる簡単なクラスになります。「{ get; set; }」というのは、簡単なプロパティの書き方で、プロパティの設定や取得ができるという意味になります。


■保存ボタンを作成


フォームデザイナで、保存ボタンを貼りつけます。


image


プロパティ ウィンドウで保存ボタンの名前を「buttonSave」にしておきます。


保存ボタンをダブルクリックして、保存処理を書いていきましょう。


まず、ファイルとシリアライズの機能を扱うので、ファイルの先頭に


using System.Xml.Serialization;
using System.IO;


の記述を追加します。

/// <summary>
/// 保存ボタン
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonSave_Click(object sender, EventArgs e)
{
    SaveFileDialog dlg = new SaveFileDialog();
    dlg.DefaultExt = "xml";
    dlg.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*";
    if (dlg.ShowDialog() == DialogResult.OK)
    {
        // 住所データを画面から作成
        Address addr = new Address
        {
            ruby = textRuby.Text,
            name = textName.Text,
            kind = comboKind.Text,
            zipcode = textZipCode.Text,
            addrss1 = textAddress1.Text,
            addrss2 = textAddress2.Text,
            telephone = textTelephone.Text,
            fax = textFax.Text,
            ktai = textKtai.Text,
            mail = textMail.Text
        };
        // ファイルへ保存
        var se = new XmlSerializer(typeof(Address));
        using (var fs = new FileStream(dlg.FileName, FileMode.Create))
        {
            se.Serialize(fs, addr);
        }
        MessageBox.Show("保存しました");
    }
}

テキストボックスから各プロパティに代入した後で、ファイルに保存します。


保存先のファイル名を入力できるように、SaveFileDialog クラスを使って、保存ダイアログが開くようにしておきます。保存ダイアログというのは、保存先を指定できる標準のダイアログです。


image


また、シリアライズして保存する場合は、XmlSerializer クラスを使って保存します。ここのあたりの書き方も定番なので覚えてしまってください。


■実行すると、どんなファイルができるのか?


デバッグ実行して、住所データを適当に入力した後で保存してみましょう。


そして、XML 形式のデータがどうなっているか、メモ帳などで覗いてみます。


image


こんな風にテキストで保存されます。「<ruby>とにい でん</ruby>」のように、タグで囲まれるのが XML 形式のルールです。


■保存したファイルを読み込む


今度は、XML 形式のファイルを読み込む機能をつけてみます。


フォームデザイナで「読込」ボタンをフォームに貼りつけます。


image


「読込」ボタンの名前を「buttonLoad」に変更して、ボタンをダブルクリックします。


読込ボタンの処理は、次のようにコーディングします。

/// <summary>
/// 読込ボタン
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonLoad_Click(object sender, EventArgs e)
{
    OpenFileDialog dlg = new OpenFileDialog();
    dlg.DefaultExt = "xml";
    dlg.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*";
    if (dlg.ShowDialog() == DialogResult.OK)
    {
        // ファイルへ保存
        var se = new XmlSerializer(typeof(Address));
        using (var fs = new FileStream(dlg.FileName, FileMode.Open))
        {
            Address addr = (Address)se.Deserialize(fs);

            textRuby.Text = addr.ruby;
            textName.Text = addr.name;
            comboKind.Text = addr.kind;
            textZipCode.Text = addr.zipcode;
            textAddress1.Text = addr.addrss1;
            textAddress2.Text = addr.addrss2;
            textTelephone.Text = addr.telephone;
            textFax.Text = addr.fax;
            textKtai.Text = addr.ktai;
            textMail.Text = addr.mail;
        }
    }
}

保存のときと同じように、XmlSerializer クラスを使います。保存とは逆に、Address オブジェクトの各プロパティからテキストボックスに設定していますね。


■保存したファイルを、読み込む


デバッグ実行して、動作を確認してみましょう。


読込ボタンをクリックして、開くのダイアログを表示させます。


image


さっき保存したファイルを指定して、「開く」ボタンをクリックすると、


image


ほら、さきほど保存した内容が表示されますね。


 


さて、今週はこれでおしまいです。


来週はこのフォームを使って、複数の住所データを扱ってみましょう。


では、See you next week, bye bye !!!