Как получить доступ к элементам внутри элемента подменю в приложении формы окна С# в ToolStripMenuItems?

В моем приложении формы Windows есть toolstripmenuitem. Мне нужно получить доступ ко всем элементам подменю и проверить, доступно ли определенное имя элемента меню, и если этот элемент найден, я хочу отключить его. Например:

     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;
                                        }
                                    }
                                }
                            }
                        }
                    }

Как получить доступ к Балансу акций и отключить его?


person Kasun Perera    schedule 05.08.2017    source источник


Ответы (1)


Как насчет рекурсивной функции, которая проходит по каждому элементу с раскрывающимися элементами, пока не найдет элемент с указанным именем? что-то вроде этого (быстро и грязно, пропущена проверка разделителей и тому подобное...):

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;
    }
}
person Michael    schedule 05.08.2017
comment
@Mr.Michael, ваш ответ очень полезен для меня. Это работает хорошо. Но теперь у меня проблема с использованием ToolStripSeparator. ToolStripSeparator находится в разделе ToolStripItem. Я получаю сообщение об ошибке: «Невозможно преобразовать объект типа «System.Windows.Forms.ToolStripSeparator» в тип «System.Windows.Forms.ToolStripMenuItem». Можете ли вы изменить свой ответ, чтобы проверить и избежать использования ToolStripSeperator? - person Kasun Perera; 08.08.2017
comment
@KasunPerera Я изменил свой код. Изменен тип параметра меню и добавлено приведение/проверка типа внутри цикла... ToolStripDropDownItem — это класс со свойством .DropDownItems, поэтому мы можем игнорировать каждый пункт меню, у которого нет этого свойства. Если в вашем меню есть комбинированные или текстовые поля, они также будут игнорироваться... - person Michael; 09.08.2017
comment
@Mr.Michael, я могу решить свою проблему, используя ваше последнее предложение. Большое спасибо. Очень ценю ваш вклад. - person Kasun Perera; 09.08.2017