2017-08-05 57 views
0

在我的Windows窗體應用程序中有一個toolstripmenuitem。 我需要訪問每個子菜單項並檢查是否有特定的菜單項名稱可用,如果找到該項目,我想禁用它。 例如:如何訪問ToolStripMenuItems中C#窗體表單應用程序中的子菜單項內的項目?

 Report 
     |__Stock 
     |  |__Stock Balance 
     |  |__Stock Reorder 
     |__Sales 
       |__Summary 

我的代碼是這樣的。根據我的代碼,我可以訪問子菜單(Stock)並禁用它。但是我無法訪問子菜單中的子項目(庫存餘額)。

String specificMenuItemName = "Stock Balance"; 

        foreach (ToolStripMenuItem menuItem in MainMenuStrip.Items) 
        { 
         if (menuItem != null) 
         { 
          if (menuItem.HasDropDownItems) 
          { 
           foreach (ToolStripItem subMenuItem in menuItem.DropDownItems) 
           { 
            if (subMenuItem is ToolStripSeparator) 
            { } 
            else 
            { 
             if (specificMenuItemName == subMenuItem.Text) 
             { 
              subMenuItem.Enabled = false; 
             } 
            } 
           } 
          } 
         } 
        } 

如何訪問到庫存餘額和禁用它?

回答

2

遞歸函數是如何遍歷每個具有下拉項目的項目,直到找到具有指定名稱的項目?像這樣(快速和骯髒,跳過檢查分離器和類似的東西...):

private static void DisableItem(ToolStripDropDownItem menu, bool enable, string text) 
{ 
    if (!menu.HasDropDownItems) 
     if (Equals(menu.Text, text)) 
      menu.Enabled = enable; 
     else 
      return; 

    foreach(var subItem in menu.DropDownItems) 
    { 
     var item = subItem as ToolStripDropDownItem; 
     if (item == null) continue; 

     if (item.HasDropDownItems) 
      DisableItem(item, enable, text); 
     if (Equals(item.Text, text)) 
      item.Enabled = enable; 
    } 
} 
+0

@ Mr.Michael,你的回答對我來說真的很有幫助。它運作良好。但是現在我遇到了使用ToolStripSeparator的問題。 ToolStripSeparator位於ToolStripItem下。我收到一個錯誤,「無法投射'System.Windows.Forms.ToolStripSeparator'類型的對象來鍵入'System.Windows.Forms.ToolStripMenuItem'。」 您可以修改您的答案以檢查並避免ToolStripSeperator? –

+1

@KasunPerera我改變了我的代碼。改變菜單參數的類型並在循環內部添加了cast/type-checking ...'ToolStripDropDownItem'是具有'.DropDownItems'屬性的類,因此我們可以忽略每個沒有該屬性的菜單項。如果您的菜單中有組合框或文本框,它們也將被忽略... – Michael

+0

@ Mr.Michael,我可以使用您的最終建議解決我的問題。非常感謝。真的很感謝你的貢獻。 –

相關問題