在制作窗体操作界面的时候,遇到这样一个问题
有这样一个窗体有这样几个按钮,对应几个动作,新增,保存,编辑,删除,取消等
与之相对应的有几个状态,比如锁定状态,可编辑状态等,按钮促发状态的改变
随着不同的状态,按钮的ENABLE值也会相应改变,比如 保存按钮必须是按了新增按钮,状态切换成新增时才可用
保存后状态切换成锁定状态,保存按钮不可用等等我一向的做法是用整型或者枚举记录状态码,在按钮单击事件切换状态及调整enable的值
但是这种做法很不好,因为新增一种状态或者新增一个按钮都会带来很大的工作量
我想问问大家对这种做法有什么好的建议没有

解决方案 »

  1.   

    想到一个方法,请大家指正1,新增一个类,继承button类,myButton,增加一个属性,EnableState集合属性,可以用哈希表或IList类型,另一个SetEnable方法,参数为Type t,需要根据状态的变化而变化的button全部继承这个类
    2,新增一个状态类,建立一个注册状态监控的委托及其静态事件.所有状态由子类实现.子类的构造函数调用父类注册过的事件.而事件的委托类型的签名与mybutton类的setenable方法保持一致,因为会将setenable方法注册到这个事件.
    3 关于setenable方法,他与当前调用者的类型进行比较(状态类的子类),如果调用时类型被EnableState集合包含,则将当前的button设置为enable
    4,根据实际情况注册事件代码:
    //对button进行扩展,我这里用了ToolStripButton
    internal class MyToolStripButton : System.Windows.Forms.ToolStripButton
            {
                internal MyToolStripButton()
                    : base()
                {
                }
                private IList<Type> enableState = new List<Type>(5);
                internal IList<Type> EnableState
                {
                    set {
                        if (value == null)
                            enableState = new  List<Type>(0);
                        else
                        {
                            enableState = value;
                        }
                    }
                    get
                    {
                        return enableState;
                    }
                }            internal void SetEnable(Type t)
                {
                    foreach (Type st in enableState)
                    {
                        if (st.GetType() == t.GetType())
                        {
                            this.Enabled = true;
                            return;
                        }
                    }
                    this.Enabled = false;
                }
            }       //状态类及正常状态的子类internal class StateTool
            {
                //状态工具
                internal static event StateRegister StateChangeEvent;
                internal delegate void StateRegister(Type stateType); //注册状态
                
                protected From senderFrom;
                internal StateTool(From sender)
                {
                    senderFrom = sender;
                }
                protected void InvokeStateEvent(Type t)
                {
                    if (StateChangeEvent != null)
                        StateChangeEvent(t);
                }
            }
            internal class NormalState:StateTool
            {
                internal NormalState(CreateNewServ sender):base(sender)
                {
                    senderFrom = sender;
                    InvokeStateEvent(typeof(NormalState));  
                }
            }        this.toolStripButton2.EnableState.Add(typeof(NormalState));  //注册该button支持的状态        StateTool.StateChangeEvent += toolStripButton2.SetEnable;    //注册该控件的事件,如果状态被更改(状态的子类发生改变,则调用setenable方法,以检查当前状态与可用状态)
            StateTool state = new NormalState(this);   //子类已发生改变,setenable触发,状态被变更那么,以后新加状态,只要扩充子类,新增加控件,只要新加支持的类型,及注册相应的方法便OK了