2011-01-14 73 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