【问题标题】:best way to enable/disable menu items based on multiple properties基于多个属性启用/禁用菜单项的最佳方法
【发布时间】:2013-10-02 21:18:01
【问题描述】:

是否有任何真正好的策略可以根据多种条件启用和禁用菜单项?

示例 - 我有一个带有“保存”和“取消”工具栏菜单项(和其他)的可编辑网格。最初加载网格时,它会检查用户是否具有编辑项目的权限。如果用户有权限 hd 可以编辑网格。最初 Save 和 Cancel 被禁用,因为它们不是必需的。如果用户进行编辑,那么我希望它们都被启用。目前我用我所谓的“FormMode”属性来做这件事。当用户开始编辑时,它会将表单/网格置于“脏”模式,并启用“保存”和“取消”按钮。如果更改了任何可编辑控件,它会将这个 (FormMode) 属性设置为 Dirty。如果他们点击“保存”或“取消”按钮,则数据将被保存并且这些按钮再次被禁用(不需要它们)。

我的问题是,是否有更好、更优雅的方式通过使用事件或其他属性来处理此启用/禁用?我在几十个表格和网格上都有同样的场景,似乎应该有一种更简单的方法来处理它。菜单项能否“感知”表单/网格状态并自动响应?我可以在多个表单中重复使用它们吗?

我不确定我的问题是否清楚 - 如果没有,抱歉。但似乎我花了很多时间让菜单项根据表单的“模式”正确运行。我喜欢只在适当的时候启用它们。

这是属性设置器:

 Public Property GridDataMode() As Mayfran.Base.BaseUtilities.FormMode Implements IGridDataMode.GridDataMode
    Get
        Return _GridDataMode
    End Get
    Set(ByVal arg As Mayfran.Base.BaseUtilities.FormMode)
        'if mode is different from previous mode, then continue:
        If _GridDataMode <> arg Then
            _GridDataMode = arg
            Select Case _GridDataMode
                Case FormMode.Initial
                    'nothing to do here
                Case FormMode.Dirty, FormMode.NewRecord
                    barButtonItemSave.Enabled = Editable
                    barButtonItemCancel.Enabled = True
                    barButtonItemSelectAll.Enabled = False
                    barButtonItemDelete.Enabled = False
                    barButtonItemPrint.Enabled = False
                    barButtonItemRefresh.Enabled = False
                Case FormMode.RecordLoaded
                    barButtonItemSave.Enabled = False
                    barButtonItemCancel.Enabled = False
                    barButtonItemSelectAll.Enabled = True
                    barButtonItemDelete.Enabled = Editable
                    barButtonItemPrint.Enabled = True
                    barButtonItemRefresh.Enabled = True
                Case Else
                    Exit Select
            End Select
            RaiseEvent GridModeChanged(arg)
        End If
    End Set
End Property

【问题讨论】:

  • 使用编辑器中的工具栏来包含图像。
  • 我刚刚给你的帖子 +1,所以你现在可以发布图片了。
  • 解决这一切的方法称为MVVM,更具体地说是CommandsRoutedCommands。 (不)幸运的是,winforms 都不支持这些,这就是为什么你真的需要考虑迁移到当前的 UI 技术。
  • @Jim HighCore 指的是 Windows Presentation Foundation (WPF),它是 WinForms 的替代品。虽然学习曲线陡峭。

标签: .net winforms


【解决方案1】:

我是 StackOverflow 的新手。我没有足够的声誉来发表评论,但我希望我能提供帮助。

您似乎有一个 GridView 控件,并希望使用 GridView 控件的事件来禁用/启用命令栏的按钮。我建议尝试DataGridView_CellValueChanged event。您将启用保存和取消按钮,而不是像 MSDN 示例中那样调用 UpdateBalance()。如果 CellValueChanged 不适合你,还有 CellBeginEdit 和 CellEndEdit。

每个命令按钮都应该有一个您应该能够使用的 Click 事件。我不知道您的保存按钮是自定义的还是标准的。无论如何,应该存在一个可用于禁用的 Click 事件。

GridView 控件事件的完整列表可用here。审查它们可能会有所帮助。虽然我可能不是一个重度 .NET 用户,但我已经使用事件在 Excel 中使用用户表单禁用/启用了命令按钮。我相信你也可以这样做。不要放弃!

--杰弗里

【讨论】:

  • 谢谢。我实际上正在使用 DevExpress Grid Control,并且我正在使用更改的单元格值来设置 FormMode 属性,但我的问题更多是关于是否有办法自动执行此操作,我认为上面提到的 HighCore 可能是最好的接近。
猜你喜欢
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 2014-04-17
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多