在我的Windows应用程序中,我有一个带网格的上下文菜单,问题是我想根据用户previlages在上下文菜单中禁用ToolStripMenuItem。我该怎么做。我这样做但是没有用
private void contextMenuStrip_Machine_Opening(object sender, CancelEventArgs e)
{
toolStripAuthorize.Enabled = INFOpermission.accessAuthorize;
}
但它不起作用
答案 0 :(得分:6)
您需要将toolStripAuthorize.Enabled
设置为true
或false
。
我不知道INFOpermission.accessAuthorize
是什么,因为你没有显示定义它的代码(枚举?),但是如果它不是false
,那么这不会有用就像你期望的那样。
我可以保证在Enabled
property处理程序中将您要禁用的ToolStripMenuItem
的{{3}}设置为false
。如果它不适合你,那你就做错了其他事情,你还需要提供更多信息。
如果您遇到困难,请在此处查看示例代码:Opening
event
编辑:根据评论中提供的新信息,我现在已经找到了问题的根源。您已将ContextMenuStrip
分配给RowTemplate
控件的DataGridView
,因此无法在其Opening
事件处理程序方法中修改该上下文菜单中包含的项目。
事实证明,这是一个已知的错误,有人认为这是“按设计”。您可以看到原始错误报告How to: Handle the ContextMenuStrip Opening Event。给出的解释是,每当根据RowTemplate
(RowTemplate
的工作原理)创建新行时,您指定的ContextMenuStrip
也会被克隆。这意味着每行不使用相同的上下文菜单实例,并且您尝试在原始菜单项上设置的任何属性都不起作用。
幸运的是,它也为我们提供了一种解决方法。与所有事件一样,Opening
事件会将即将打开的ContextMenuStrip
的实际实例作为其sender
参数传递。 此是上下文菜单,您需要修改其中的项目才能看到您的修改。
那么代码是什么?它看起来像这样:
private void contextMenuStrip_Opening(object sender, CancelEventArgs e)
{
ContextMenuStrip cmnu = (ContextMenuStrip)sender;
cmnu.Items[1].Enabled = false;
}
但请注意,您必须引用要通过其索引修改的单个菜单项。这只是您要修改的菜单中项目的从零开始的位置。您不能像以前那样使用toolStripAuthorize
对象,因为已为每个新的上下文菜单实例克隆了一个新实例。