如何动态地禁用上下文菜单中的ToolStripMenuItem?

时间:2011-01-14 10:48:22

标签: c# .net winforms toolstrip contextmenustrip

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

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

但它不起作用

1 个答案:

答案 0 :(得分:6)

您需要将toolStripAuthorize.Enabled设置为truefalse

我不知道INFOpermission.accessAuthorize是什么,因为你没有显示定义它的代码(枚举?),但是如果它不是false,那么这不会有用就像你期望的那样。

我可以保证在Enabled property处理程序中将您要禁用的ToolStripMenuItem的{​​{3}}设置为false 。如果它不适合你,那你就做错了其他事情,你还需要提供更多信息。

如果您遇到困难,请在此处查看示例代码:Opening event


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

事实证明,这是一个已知的错误,有人认为这是“按设计”。您可以看到原始错误报告How to: Handle the ContextMenuStrip Opening Event。给出的解释是,每当根据RowTemplateRowTemplate的工作原理)创建新行时,您指定的ContextMenuStrip也会被克隆。这意味着每行不使用相同的上下文菜单实例,并且您尝试在原始菜单项上设置的任何属性都不起作用。

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

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

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

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