在制作窗体操作界面的时候,遇到这样一个问题
有这样一个窗体有这样几个按钮,对应几个动作,新增,保存,编辑,删除,取消等
与之相对应的有几个状态,比如锁定状态,可编辑状态等,按钮促发状态的改变
随着不同的状态,按钮的ENABLE值也会相应改变,比如 保存按钮必须是按了新增按钮,状态切换成新增时才可用
保存后状态切换成锁定状态,保存按钮不可用等等我一向的做法是用整型或者枚举记录状态码,在按钮单击事件切换状态及调整enable的值
但是这种做法很不好,因为新增一种状态或者新增一个按钮都会带来很大的工作量
我想问问大家对这种做法有什么好的建议没有
有这样一个窗体有这样几个按钮,对应几个动作,新增,保存,编辑,删除,取消等
与之相对应的有几个状态,比如锁定状态,可编辑状态等,按钮促发状态的改变
随着不同的状态,按钮的ENABLE值也会相应改变,比如 保存按钮必须是按了新增按钮,状态切换成新增时才可用
保存后状态切换成锁定状态,保存按钮不可用等等我一向的做法是用整型或者枚举记录状态码,在按钮单击事件切换状态及调整enable的值
但是这种做法很不好,因为新增一种状态或者新增一个按钮都会带来很大的工作量
我想问问大家对这种做法有什么好的建议没有
解决方案 »
- 那位高人winform有用到过AxOfficeViewer插件和AxAcroPDFLib.AxAcroPDF插件往给予指教
- 求反向算法
- 鼠标滑过 TextBox 文本框里的内容消失!
- 如何引用 DataTable?
- 如何通过DataReader得到到列数的个数.
- form编程中如何在datagrid中选中多行,并使用Ctrl+C能够将选定内容复制进剪贴板------急阿
- hbxtlhx(下着春雨的天) 请进
- C# Internal connection fatal error,请高手赐教
- 如何提取数据库的内容直接生成ZIP?
- 個人原因好久沒有來csdn了。今天一來發現自己榮譽分只有94了。可能很久沒結貼得原因,另兩個問題。
- pda设备仿真器模拟器分辨率问题????
- 关于enum的一个问题
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了