扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在本页阅读全文(共2页)
最近写程序当中需要做一个表单提交(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();
    }
第二步,写TextBox、Button控件。这里用到了TextBoxRegex。
TextBox控件:
    public class CNWTextbox : TextBoxRegex, ISubject
    ...{
        private ArrayList obsList;
        public CNWTextbox()
        ...{
            obsList = new ArrayList();
            this.UseInvalidTextException = true;
        }
        ISubject 成员#region ISubject 成员
        public IList MyObserver
        ...{
            get ...{ return obsList; }
        }
        public void Attach(IObserver obs)
        ...{
            obsList.Add(obs);
            obs.Attach(this);
        }
        public void Detach(IObserver obs)
        ...{
            obsList.Remove(obs);
            obs.Detach(this);
        }
        public void Notify()
        ...{
            foreach (IObserver obs in obsList)
            ...{
                obs.Update();
            }
        }
        #endregion
        protected override void OnTextChanged(EventArgs e)
        ...{
            base.OnTextChanged(e);
            //通知所有Observer更新自己。
            Notify();
        }
        public bool IsValided()
        ...{
            try
            ...{
                string temp = this.TextValidated;
                return true;
            }
            catch (Chopeen.InvalidTextException ex)
            ...{
                Console.WriteLine(ex.ToString());
                return false;
            }
        }
    }
Button控件:
public class CNWButton:Button,IObserver
    ...{
        private ArrayList mySubjects;
        public CNWButton()
        ...{
            mySubjects = new ArrayList();
        }
        IObserver 成员#region IObserver 成员
        void IObserver.Update()
        ...{
            foreach (ISubject sub in mySubjects)
            ...{
                if (sub.IsValided())
                ...{
                    this.Enabled = true;
                }
                else
                ...{
                    this.Enabled = false ;
                    break;
                }
            }
        }
        void IObserver.Attach(ISubject sub)
        ...{
            mySubjects.Add(sub);
        }
        void IObserver.Detach(ISubject sub)
        ...{
            mySubjects.Remove(sub);
        }
        System.Collections.IList IObserver.MySubject
        ...{
            get ...{ return mySubjects; }
        }
        #endregion
    }
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。