【问题标题】:Windows Forms, enable disable controls depending onWindows 窗体,启用禁用控件取决于
【发布时间】:2011-07-20 09:37:30
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 如果你有这样复杂的规则,我认为你可能只需要手动完成。

标签: c# .net winforms


【解决方案1】:

在 WPF 中有一个叫做可视状态管理器的东西。你可以在 WinForms 中实现类似的东西。基本上你的表单可以有状态,并且控制修改应该只允许在状态中。然后你调用一个转换来改变状态。至少所有修改代码都可以被状态管理器调用的方法中隐藏起来。

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

在 WPF 中,我认为有某种设计器支持。在 WinForms 中可能会遵循诸如本地化在表单上的工作方式之类的方法,但它涉及到。

我为一个项目做了一个粗略的状态管理器,它获取了一个字符串状态名称列表和对应的委托给要调用的方法,那么将所有修改代码保留在方法中而不是对表单进行修饰只是一个好习惯。

【讨论】:

  • 我正在考虑将表单视为一组功能并以状态模式的方式实现每个功能。像 ICompareItemsFeature、IAddItemFeature 等等。通过控制事件处理程序,我将进行转换。
【解决方案2】:

我不确定这对您有多大帮助,但就我而言,当有这么多控件需要对有限/受限的一组条件采取行动时,我的方法是:

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

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

但正如您可能所说,这些方法可能无法很好地概括,您可能需要实现某种模式/界面来代表控件观察动作/上下文,然后在合适的条件下打开/关闭它们满足。

【讨论】:

    【解决方案3】:

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

    在您的应用中实现 EventManager 以“挂钩”从不同控件接收的事件,将它们转换为 AsbtractControl 并推送 StateStack 隐含的状态由用户“激活”的控件。

    实现 DesitionalEngine 来解析每个动作 StateStack 并启用/禁用 UI 上的控件,并根据所做的目标清除/或不堆栈。原因,正如您所说,也可以基于多个控件操作来完成启用/禁用目标。

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

    希望这会有所帮助。

    问候。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        相关资源
        最近更新 更多