熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

自驗證文本框和Observer模式

2013-11-13 10:15:03  來源: .NET編程 

  最近寫程序當中需要做一個表單提交(WinForm)當所有的表單項目符合要求時提交按鈕為可用否則不可用一般我們需要寫一個驗證的函數然後觸發TextBox的某個事件來調用函數函數中記錄下是否所有的表單項目都符合要求是則提交按鈕可用

  關於自驗證本文框在CodeProject上找到了TextBoxRegex是一個不錯的自驗證TextBox

  關於Observer模式按照四人團的說法Observer 模式的意圖是定義對象間的一種一對多的依賴關系當一個對象的狀態發生改變時所有依賴於它的對象都得到通知並自動更新

  直接給代碼

  第一步定義兩個接口

  IObserver接口



    public interface IObserver
    {
        void Update();
        void Attach(ISubject sub);
        void Detach(ISubject obs);
        IList MySubject { get;  }
    }

  ISubject接口



public interface ISubject
    {
        IList MyObserver { get ;  }
        void Attach(IObserver obs);
        void Detach(IObserver obs);
        void Notify();
        bool IsValided();
    }

  第二步寫TextBoxButton控件這裡用到了TextBoxRegex

  TextBox控件



    public class CNWTextbox : TextBoxRegex ISubject
    {
        private ArrayList obsList;
        public CNWTextbox()
        {
            obsList = new ArrayList();
            thisUseInvalidTextException = true;
        }
        ISubject 成員#region ISubject 成員

        public IList MyObserver
        {
            get { return obsList; }
        }

        public void Attach(IObserver obs)
        {
            obsListAdd(obs);
            obsAttach(this);
        }

        public void Detach(IObserver obs)
        {
            obsListRemove(obs);
            obsDetach(this);
        }

        public void Notify()
        {
            foreach (IObserver obs in obsList)
            {
                obsUpdate();
            }
        }

        #endregion
        protected override void OnTextChanged(EventArgs e)
        {
            baseOnTextChanged(e);
            //通知所有Observer更新自己
            Notify();
        }
        public bool IsValided()
        {
            try
            {
                string temp = thisTextValidated;
                return true;
            }
            catch (ChopeenInvalidTextException ex)
            {
                ConsoleWriteLine(exToString());
                return false;
            }
        }
    }

  Button控件



public class CNWButton:ButtonIObserver
    {
        private ArrayList mySubjects;
        public CNWButton()
        {
            mySubjects = new ArrayList();
        }
        IObserver 成員#region IObserver 成員

        void IObserverUpdate()
        {
            foreach (ISubject sub in mySubjects)
            {
                if (subIsValided())
                {
                    thisEnabled = true;
                }
                else
                {
                    thisEnabled = false ;
                    break;
                }
            }
        }
        void IObserverAttach(ISubject sub)
        {
            mySubjectsAdd(sub);
        }

        void IObserverDetach(ISubject sub)
        {
            mySubjectsRemove(sub);
        }

        SystemCollectionsIList IObserverMySubject
        {
            get { return mySubjects; }
        }

        #endregion
    }

  第三步使用

  cnwTextboxcnwTextboxcnwButton是上面制作的控件



private void Form_Load(object sender EventArgs e)
        {
            cnwTextboxAttach(cnwButton);
            cnwTextboxAttach(cnwButton);
        }

  第四步運行


From:http://tw.wingwit.com/Article/program/net/201311/13047.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.