Windows窗体,启用禁用控件取决于

时间:2011-07-20 09:37:31

标签: c# .net winforms

是否有人知道根据上下文启用/禁用表单控件的正确方法?问题是,我的表单上有大约50个控件,它们的状态应该取决于某些列表中选择的项目,选中的复选框以及DB上的某些数据是否存在。

相当粗略的例子是你有一个多选树视图和一个像“比较”的按钮。只有在树视图中选择的节点都属于同一类型时,才应启用此按钮。此外,还有一个要求是,只有在选择了2个节点时才应启用此功能。还有一个,并不是每个类都可以进行比较,因此对于您应该选择什么来进行比较也存在限制。

问题不在于Control.Enabled = true / false。问题是关于通用方法。

感谢。

4 个答案:

答案 0 :(得分:2)

在WPF中有一种叫做Visual State Manager的东西。你可以在WinForms中实现类似的东西。基本上,您的表单可能具有状态,并且只应在状态中允许控制修改。然后你调用转换来改变状态。然后,至少所有修改代码都可以在状态管理器调用的方法中进行处理。

http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-visual-state-manager-overview.aspx

在WPF中,我认为有某种设计师支持。在WinForms中可能会出现类似本地化在表单上工作的内容,但它涉及到它。

我为一个项目做了一个粗略的状态管理器,它接受了一个字符串状态名称列表和相应的方法来调用方法,然后将所有修改代码保存在方法中并且不对表单进行修饰是一种很好的做法。

答案 1 :(得分:1)

我不确定这对你有多大帮助,但在我的情况下,如果有这么多控件需要在一组有限/受限的条件下采取行动,那么我的方法是:

  1. 默认情况下禁用所有控件,只有在满足使用条件时才启用任何控件。这可以确保用户获得何时可以使用控件的视觉提示,但需要更多工作,因为它需要我们检查条件何时丢失,以便可以再次禁用控件。

  2. 默认情况下启用/启用所有控件,但仅在满足所需条件时才采取操作/响应用户操作。

  3. 但是你可能会说,这些方法可能不会很好地概括,你可能需要实现某种类型的模式/接口来代表控件观察动作/上下文,然后在正确的条件下打开/关闭它们满足了。

答案 2 :(得分:1)

另一个想法可能是:使每个需要状态管理的控件实现 AsbtractControl 类,这意味着每个孩子都会定义它的特定通知状态

在您的应用中实施 EventManager ,以“挂钩”从不同控件收到的事件,将其转换为 AsbtractControl 并按下 StateStack 隐含的状态由控件刚刚被用户“激活”。

实施 DesitionalEngine ,解析每个操作 StateStack 并启用/禁用UI上的控件,并根据所做的设置清除/不清除堆栈。正如你所说的那样,也可以根据多个控件动作完成desition Enable / Disable。

只是为了给你一个想法,因为我在几年前为WinForms实现了一些类似的东西。

希望这有帮助。

问候。

答案 3 :(得分:0)

如果我们使用对象模型,我有一个解决上述问题的解决方案,那么很容易维护所有控件的状态。