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

第8回 オブジェクト指向プログラミングの省力化

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

Logicの作成

次にLogicコンポーネントを作成します。

新規作成

ソリューションエクスプローラーから,DataSetを登録した方法と同様に,Logicというコンポーネントを追加してください。

画像

上記のように,DataSet1,MyTableTableAdapter,BindingSourceコンポーネントをLogicコンポーネントのコンテナに配置します。 各コンポーネントオブジェクトの名前も,上記と同様になっていることを確認してください。

BindingSource1の設定

BindingSourceは,DataSet1のMyTableオブジェクトとフォームオブジェクト上のユーザーコントロールとのデータバインディングを行う際に便利なコンポーネントです。

画像

上記のように,DataSourceにdataSet1を,DataMemberにMyTableを設定します。 これによって,dataSet1.MyTableオブジェクトはBindingSourceオブジェクトにバインドされたことになります。

BindingSourceオブジェクトとユーザーコントロールのバインディングの方法は,次項でご説明します。

コードの作成

Logic クラスのコードは次のようになります。 なお,今回はあえて,Fillメソッドによって全レコードをDataSetオブジェクトに格納してみたいと思います。


using System;
using System.Data;
using System.ComponentModel;
namespace WindowsFormsApplication1
{
    //*************************************************************
    /// <summary>電話帳サンプル</summary>
    //*************************************************************
    public partial class Logic : 
        Component, INotifyPropertyChanged
    {
        //*************************************************************
        /// <summary>コンストラクタ</summary>
        //*************************************************************
        public Logic() {
            this.InitializeComponent();
        }

        public Logic(IContainer container) {
            if (container != null) container.Add(this);
            this.InitializeComponent();
        }

        //*************************************************************
        /// <summary>PropertyChanged イベント</summary>
        //*************************************************************
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName) {
            if (this.PropertyChanged == null) return;
            this.PropertyChanged(
                this, new PropertyChangedEventArgs(propertyName));
        }       

        //*************************************************************
        /// <summary>Code プロパティ</summary>
        //*************************************************************
        private int _Code;
        public int Code {
            get { return this._Code; }
            set {
                if (this._Code == value) return;
                this._Code = value;
                this.OnPropertyChanged("Code");
            }
        }

        //*************************************************************
        ///<summary>BindingSource プロパティ</summary>
        //*************************************************************
        public System.Windows.Forms.BindingSource BindingSource {
            get { return this.bindingSource1; }
        }

        //*************************************************************
        /// <summary>DataSet オブジェクトにテーブルデータを格納します
        /// </summary>
        //*************************************************************
        public void Fill() {
            this.myTableTableAdapter.Fill(this.dataSet1.MyTable);
            this.SetCode();
        }

        //*************************************************************
        /// <summary>追加処理を実行します</summary>
        //*************************************************************
        public void Add() {
            this.InvalidCode();
            if (this.bindingSource1.Find("番号", this.Code) >= 0) {
                throw new Exception("既に登録されている番号です");
            }

            object newRow = this.bindingSource1.AddNew();
            DataSet1.MyTableRow row = this.GetMyTableRow(newRow);
            if (row == null) throw new Exception("追加に失敗しました");
            row.番号 = this.Code;

            this.bindingSource1.EndEdit();
            myTableTableAdapter.Update(this.dataSet1.MyTable);

            this.Read();
        }

        //*************************************************************
        /// <summary>更新処理を実行します</summary>
        //*************************************************************
        public void Update() {
            this.InvalidCode();
            this.bindingSource1.EndEdit();
            this.myTableTableAdapter.Update(this.dataSet1.MyTable);
        }

        //*************************************************************
        /// <summary>削除処理を実行します</summary>
        //*************************************************************
        public void Delete() {
            this.InvalidCode();
            this.bindingSource1.RemoveCurrent();
            this.bindingSource1.EndEdit();
            this.myTableTableAdapter.Update(this.dataSet1.MyTable);
            this.SetCode();
        }

        //*************************************************************
        /// <summary>読込み処理を実行します</summary>
        //*************************************************************
        public void Read() {
            int i = this.bindingSource1.Find("番号", this.Code);
            if (i < 0) throw new Exception("番号が見つかりません");
            this.bindingSource1.Position = i;
            this.SetCode();
        }

        //*************************************************************
        /// <summary>番号値が有効かどうかを検証した結果を取得します
        /// </summary>
        //*************************************************************
        private void InvalidCode() {
            if (this.Code > 0 || this.Code < 100000000) return;
            throw new Exception("番号が有効な値ではありません");
        }

        //*************************************************************
        /// <summary>現在行のコード値をテキストボックスに設定します
        /// </summary>
        /// <remarks>現在行が null ならゼロに設定します</remarks>
        //*************************************************************
        private void SetCode() {
            DataSet1.MyTableRow row = 
                this.GetMyTableRow(this.bindingSource1.Current);
            if (row == null) {
                this.Code = 0;
                return;
            }
            this.Code = row.番号;
        }

        //*************************************************************
        /// <summary>DataSet1.MyTableRow 型に変換した結果を取得します
        /// </summary>
        /// <param name="value">変換したい値</param>
        /// <returns>DataSet1.MyTableRow 型に変換した結果</returns>
        /// <remarks>変換できない場合は null 値を返します</remarks>
        //*************************************************************
        private DataSet1.MyTableRow GetMyTableRow(object value) {
            DataRowView v = value as DataRowView;
            if (v == null) return null;

            return v.Row as DataSet1.MyTableRow;
        }
    }
}

中で使用するオブジェクトが異なるため,前回作成したLogicクラスとは少々違っています。

著者プロフィール

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

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