2017-08-05 11 views
0

私のWindowsフォームアプリケーションにtoolstripmenuitemがあります。 私はすべてのサブメニュー項目にアクセスし、特定のメニュー項目名があるかどうかをチェックする必要があり、その項目が見つかった場合は無効にする必要があります。 例:ToolStripMenuItemsでC#windowsフォームアプリケーションのサブメニュー項目内の項目にアクセスするには?

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

私のコードは次のとおりです。私のコードによれば、私はサブメニュー(Stock)にアクセスしてそれを無効にすることができます。しかし、サブメニュー内の子アイテム(Stock Balance)にアクセスすることはできません。

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コードを変更しました。 menu-parameterのタイプが変更され、ループ内にキャスト/タイプチェックが追加されました... 'ToolStripDropDownItem'は' .DropDownItems'プロパティを持つクラスで、このプロパティを持たないすべてのメニューアイテムを無視できます。あなたのメニューにコンボボックスやテキストボックスがある場合、それらも無視されます。 – Michael

+0

@ Mr.Mael、私はあなたの最終提案を使って私の問題を解決することができます。どうもありがとう。本当にあなたの貢献を感謝します。 –

関連する問題