2011-01-14 76 views
2

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

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

,但它不工作

+1

1.向我们展示更多代码。 2.当您在赋值后放置断点时,toolStripAuthorize将Enabled设置为false还是true? 3.当预期时,INFOpermission.accessAuthorize是否设置为false? – dzendras 2011-01-14 10:53:32

回答

6

您需要设置toolStripAuthorize.Enabled要么truefalse

我不知道什么是INFOpermission.accessAuthorize因为你没有显示定义代码(枚举?),但如果它比false其他任何东西,这是不会像你期望的工作了。

我可以保证,设置要禁用falseOpening event处理ToolStripMenuItemEnabled property将工作。如果它不适合你,你做了其他的事情,你需要给我们更多的信息。

如果你坚持,看到这里的示例代码:How to: Handle the ContextMenuStrip Opening Event


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

事实证明,这是一个已知的错误,某人决定是“按设计”。你可以看到原始的错误报告here on Microsoft Connect。给出的解释是,无论何时根据RowTemplateRowTemplate的工作方式)创建新行,您分配的ContextMenuStrip也会被克隆。这意味着每行不使用相同的上下文菜单实例,并且您试图在原始菜单项上设置的任何属性都不起作用。

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

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

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

通知,不过,你必须引用您希望通过它的索引修改个别菜单项。这只是您要修改的菜单中项目的从零开始的位置。您不能使用之前尝试执行的toolStripAuthorize对象,因为它的新实例已针对每个新的上下文菜单实例进行了克隆。

+0

它正在返回false并且值也在确定,但它显示的是toolstripmenu – Nighil 2011-01-14 11:35:13