【问题标题】:How to disable ToolStripMenuItem in Context menu Dynamically?如何动态禁用上下文菜单中的 ToolStripMenuItem?
【发布时间】:2011-06-09 01:56:16
【问题描述】:

在我的 Windows 应用程序中,我有一个带有网格的上下文菜单,问题是我想根据用户 previlages 禁用上下文菜单中的 ToolStripMenuItem。我该怎么做。我已经这样做了,但它不起作用

private void contextMenuStrip_Machine_Opening(object sender, CancelEventArgs e)
{
    toolStripAuthorize.Enabled = INFOpermission.accessAuthorize;
} 

但它不起作用

【问题讨论】:

  • 1.向我们展示更多代码。 2. 当你在赋值之后放置断点时,toolStripAuthorize 的 Enabled 是否设置为 false 或 true? 3. INFPermission.accessAuthorize 是否按预期设置为 false?

标签: c# .net winforms toolstrip contextmenustrip


【解决方案1】:

您需要将toolStripAuthorize.Enabled 设置为truefalse

我不知道INFOpermission.accessAuthorize 是什么,因为您没有显示定义它的代码(枚举?),但如果它不是false,则不会像您预期的那样工作。

我可以保证在Opening event 处理程序中将您要禁用的ToolStripMenuItemEnabled property 设置为false会起作用。如果它对您不起作用,则说明您做错了其他事情,您需要向我们提供更多信息才能继续。

如果遇到困难,请在此处查看示例代码:How to: Handle the ContextMenuStrip Opening Event


编辑:有了 cmets 中提供的新信息,我现在已经隔离了问题的根源。您已将ContextMenuStrip 分配给DataGridView 控件的RowTemplate,因此无法在其Opening 事件处理程序方法中修改该上下文菜单中包含的项目。

事实证明,这是一个已知的错误,有人认为这是“设计使然”。您可以查看原始错误报告here on Microsoft Connect。给出的解释是,每当基于RowTemplate(这是RowTemplate 的工作方式)创建新行时,您分配的ContextMenuStrip 也会被克隆。这意味着不会对每一行使用相同的上下文菜单实例,并且您尝试在 original 菜单项上设置的任何属性都无效。

幸运的是,它也为我们提供了一种解决方法。与所有事件一样,Opening 事件将即将打开的ContextMenuStrip 的实际实例作为其sender 参数传递。 是上下文菜单,您需要修改其项目才能使您的更改可见。

那么代码是什么?看起来像这样:

private void contextMenuStrip_Opening(object sender, CancelEventArgs e)
{
    ContextMenuStrip cmnu = (ContextMenuStrip)sender;
    cmnu.Items[1].Enabled = false;
}

但请注意,您必须通过索引引用要修改的单个菜单项。这只是您要修改的菜单项的从零开始的位置。您不能像以前那样使用 toolStripAuthorize 对象,因为它的新实例已为每个新的上下文菜单实例克隆。

【讨论】:

  • 它返回 false 并且值也在 assining 但工具条菜单正在显示
  • @NIGHIL:菜单仍然会打开。如果要取消菜单打开,设置e.Cancel = true。设置特定项目的Enabled 属性将导致它在菜单中显示为灰色(不可选择)。你想做什么?
  • @Code Gray:菜单将打开,但禁用的项目在菜单中启用,INFOpermission.accessAuthorize 的值为 false
  • if (INFOpermission.accessAuthorize == false)contextMenuStrip_Machine.Items.Remove(toolStripAuthorize); toolStripAuthorize 有没有被删除
  • @NIGHIL:所以,菜单项的名称实际上与您在原始代码中发布的名称不同?然后只需将 that 设置为禁用。由于我无法从我坐的位置看到您的屏幕,因此很难猜出您的所有控件/变量的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 2021-09-27
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
相关资源
最近更新 更多