VB6開発者向け:C#で始める.NETプログラミング

第7回 オブジェクト指向プログラミング(2)

この記事を読むのに必要な時間:およそ 6 分

ユーザーインターフェイスのクラスを作る

Form1クラスは,プロジェクトの作成と共に自動的に作られています。 このクラスでは,ユーザーの操作に関する処理を受け持ちます。

今までに作成したクラスを使って,以下のように書くことができます。

using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    //*************************************************************
    /// <summary>電話帳サンプルソフトフォーム</summary>
    //*************************************************************
    public partial class Form1 : Form 
    {
        private Logic logic;

        //*************************************************************
        ///<summary>コンストラクタ</summary>
        //*************************************************************
        public Form1() {
            this.InitializeComponent();
            this.logic = new Logic();

            this.codeTextBox.DataBindings.Add(
                "Text", this.logic, "Code");
            this.nameTextBox.DataBindings.Add(
                "Text", this.logic.Row, "Name");
            this.telephoneNumberTextBox.DataBindings.Add(
                "Text", this.logic.Row, "TelephoneNumber");
        }

        //*************************************************************
        // イベント処理用メソッド
        //*************************************************************
        private void addButton_Click(object sender, EventArgs e) {
            try {
                this.logic.Add();
            }
            catch(Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }

        private void closeButton_Click(object sender, EventArgs e) {
            this.Close();
        }

        private void readButton_Click(object sender, EventArgs e) {
            try {
                this.logic.Read();
            }
            catch(Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }

        private void updateButton_Click(object sender, EventArgs e) {
            try {
                this.logic.Update();
            }
            catch(Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }

        private void deleteButton_Click(object sender, EventArgs e) {
            try {
                this.logic.Delete();
            }
            catch(Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

上記のコードを眺めることで,このクラスがLogicオブジェクトのフロントエンドな部分を受け持つためのだけに存在していることが分かるかと思います。

データバインディング

前回移植したコードでは,必要に応じて値を取得して,その都度TextBox.Textに値を格納したり,逆にTextBox.Textから値を取得していました。

しかし,今回作成したコードでは,例えばnameTextBox.Textの値は,常にRowオブジェクトのNameプロパティの値と同じです。 codeTextBoxもtelephoneNumberTextBoxも同様に,対応するオブジェクトプロパティが存在します。

つまり,各TextBoxオブジェクトのTextプロパティは,RowオブジェクトやLocigオブジェクトの対応するプロパティ値と常に同じ状態を保つことができればよいのです。

コンストラクタにある以下のコードが,この処理を実現しています。

this.codeTextBox.DataBindings.Add(
    "Text", this.logic, "Code");
this.nameTextBox.DataBindings.Add(
    "Text", this.logic.Row, "Name");
this.telephoneNumberTextBox.DataBindings.Add(
    "Text", this.logic.Row, "TelephoneNumber");

このコードを見て,賢明な方は疑問を持ち,さらに賢明な方は既に前項で説明した内容によって納得していただけるかと思います。

詳細についてcodeTextBoxを例にとって順にご説明します。

【質問】

codeTextBoxにオブジェクトをバインディングしています。 従って,自身のオブジェクトのTextプロパティの値が変わったタイミングで,新しい値をlogicオブジェクトのCodeプロパティに格納することは簡単にできるでしょう。

しかし,logicオブジェクトのCodeプロパティの値が変わってもcodeTextBoxオブジェクトが知ることができなければ,常に同じ値に保つことはできません。どうすればよいのでしょうか?

【回答】

バインディングしたオブジェクトは,すべてINotifyPropertyChangedインターフェイスを継承し,プロパティの値が変わるとPropertyChangedイベントが発生します。

このイベントによってcodeTextBoxは,logicオブジェクトのCodeプロパティの値が変わったことを知り,自身のTextプロパティの値を設定しなおしています。

つまり,このためにINotifyPropertyChangedインターフェイスを継承してPropertyChangedイベントを発生させていたという訳です。

コマンドの実行

以下は,追加ボタンが押された時に実行されるコードです。

try {
    this.logic.Add();
}
catch(Exception ex) {
    MessageBox.Show(ex.Message);
}

これによって,logicオブジェクトのAddメソッドを実行させた時に例外エラーが発生した時は,catchブロックのコードが実行されます。 catchでは,Exceptionオブジェクトを受け取って,Messageプロパティの値をMessageBoxに表示することでエラーメッセージを表示しています。

発生する例外エラーで渡されるオブジェクトはException型だけではありませんが,通常はExceptionクラスから派生したクラスによって生成されているため,Exception型で受け取ることができます。

今回作成したクラスダイアグラム

今回作成したクラスダイアグラムは次のようになっています。

今回作成したクラスダイアグラム

今回作成したクラスダイアグラム

次回の予定

前回から2回にわたって,オブジェクト指向プログラミングを意識してサンプルソフトを作成してみました。

次回はIDEの機能や既存のクラスを利用した省力化の方法をご紹介します。

著者プロフィール

伊藤達也(いとうたつや)

(株)井沢電器設備にて、業務管理システムの開発に従事しています。 この記事の趣旨通り、筆者自身が2005年後半にメインの開発言語をVB6からC#に移行し、2007年には Microsoft MVPアワードをC#で受賞しました。