えムナウのプログラミングのページ

えムナウ の とどけもの

 Logo えムナウBlog@AILight
えムナウBlog@Wankuma

目次

利用状況

イメージ ギャラリー

カテゴリ

Links
 

inetaj

MSMVPロゴ
MSMVP Visual C# 2005/01-2007/12

目次

ユーザーコントロール

サンプル5 PropertyChangeイベントの作成


クラスのコレクションや配列を作成したときに一要素を変更してもフォームのデザインは反映されません。
クラスでPropertyChangeイベントを作成して、ユーザーコントロール側でイベントを拾ってRefreshすれば反映されます。
クラス内のイベントの作成は以前解説したサンプル2 イベントの作成のとおりで以下のようにします。


public class Cell 
{
        [Description("セルでテキストを表示するために使用する背景色です。"),Category("表示")]
        public Color BackColor
        {
                get
                {
                        return _backcolor ;
                }
                set
                {
                        _backcolor = value ;
                        RaisePropertyChange() ;
                }
        }

        private EventHandler onPropertyChange ;
        [Description("プロパティ変更されたときに発生します。"),Category("アクション")]
        public event EventHandler PropertyChange 
        { add { onPropertyChange += value; } remove { onPropertyChange -= value; } }
        protected virtual void OnPropertyChange(EventArgs e) 
        {
                if (onPropertyChange != null) onPropertyChange(this, e);
        }
        private void RaisePropertyChange()
        {
                EventArgs e = new EventArgs() ;
                OnPropertyChange( e ) ;
        }
}


呼び出すほうではクラス生成時にEventHandlerを指定してRefresh()を呼んでやります。


public class SpreadControl : System.Windows.Forms.UserControl
{
        private int columns ;
        private int rows ;
        private Cell[] item ;
        public SpreadControl()
        {
                InitializeComponent();
                columns = 3 ;
                rows = 2 ;
                item = new Cell[rows * columns] ;
                for ( int i=0 ; i<rows * columns ; i++ )
                {
                        item[i] = new Cell() ;
                        item[i].PropertyChange += new System.EventHandler(this.Cell_PropertyChange);
                }
        }

        private void Cell_PropertyChange(object sender, System.EventArgs e)
        {
                Refresh() ;
        }
}