2

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

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

但它不工作

4

1 回答 1

6

您需要设置toolStripAuthorize.Enabledtruefalse

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

我可以保证在事件处理程序中设置要禁用的Enabled属性起作用。如果它对您不起作用,则说明您做错了其他事情,您需要向我们提供更多信息才能继续。ToolStripMenuItemfalseOpening

如果您遇到困难,请参阅此处的示例代码:如何:处理 ContextMenuStrip 打开事件


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

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

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

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

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

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

于 2011-01-14T10:54:50.620 回答