Динамически удалить ToolStripMenuItems из MenuStrip с C # родителя

1

Привет всем сообществу stackoverflow, я пришел к вам сегодня, чтобы попросить помощь с проблемой, которую я пытаюсь в течение нескольких дней исправлять.

Мне нужно найти рекурсивный алгоритм, который может найти детей, если нет, тогда необходимо удалить/скрыть родительский (подмодуль). Родительские объекты имеют тег под названием: подмодуль. У детей есть объекты, называемые модулем

У меня следующие сценарии:

Main
  L Item (Tag: moduleoption)
  L SubMenu 2 (Tag: submodule)
      L Item (Tag: moduleoption)
      L Item (Tag: moduleoption)
      L SubMenu 2.1 (Tag: submodule)  <-- Remove/Hide
  L SubMenu 3 (Tag: submodule) <-- Remove/Hide

В этих сценариях я хочу скрыть: SubMenu 2.1, SubMenu 3, потому что у них нет детей.

-

Main <-- All are empty submodules, Remove/Hide MenuStrip
  L SubMenu 1 (Tag: submodule) <-- Remove/Hide
  L SubMenu 2 (Tag: submodule) <-- Remove/Hide
  L SubMenu 3 (Tag: submodule) <-- Remove/Hide

В этом втором случае, когда все подмодули пусты, тогда нет необходимости отображать menustrip Control.

Мой код:

private ToolStripMenuItem MenuStripHide(MenuStrip MenuS)
{

            if (MenuS.HasDropDownItems)
            {
                foreach (ToolStripMenuItem ToolStrip in MenuS.DropDownItems)
                {
                    if (ToolStrip.HasDropDownItems == false)
                    {
                        ToolStrip.Visible = false;
                    }

                    //call recursively
                    GetSubMenuStripItems((ToolStripMenuItem)ToolStrip);
                }
            }
            else
            {
                MenuS.Visible = false;
            }

    return menuItem;
}

Это заняло несколько дней, размышляя об этом, так как заранее большое спасибо.

Теги:
visual-studio
winforms

1 ответ

0

Если я правильно понял ваш вопрос, я думаю, что для вас будет работать следующее. Он начинается с RemoveMenuItems, полосы корневого меню. Он будет перебирать всех своих детей в RemoveToolStripItems. Я оставил его в базовом классе, если у вас есть объекты non- ToolStripMenuItem в меню, которое все еще может работать. RemoveToolStripItems проверяет, что вызов к нему не заставляет его скрываться (в случае, если родитель должен скрыть), и что тег не имеет типа {подмодуль}. Если выполняется одно из этих условий, для каждого из них и для всех детей установлено значение Available = false (эквивалент ToolStripItem Visible = False). Если все дети скрыты, тогда элемент управления также устанавливает значение "Доступно" для "false".

    private void RemoveMenuItems(MenuStrip menuStrip1) {
        foreach (object menuItem in menuStrip1.Items) {
            RemoveToolStripItems(menuItem as ToolStripItem, false);
        }
    }
    /// <summary>
    /// Checks to see if the ToolStripItem that is passed to it has a tag type of {submodule},
    /// if it does then hide all of the children (if applicable). If all children are hidden, hide current.
    /// </summary>
    private bool RemoveToolStripItems(ToolStripItem toolStripItem, bool forceHide) {
        if (toolStripItem == null) { return false; }
        ToolStripMenuItem menuItem = toolStripItem as ToolStripMenuItem;
        bool hideCurrent = forceHide || ((toolStripItem.Tag as submodule) != null);
        if (menuItem != null && menuItem.HasDropDownItems) {
            bool allChildrenAreHidden = true;
            foreach (object dropDownItem in menuItem.DropDownItems) {
                allChildrenAreHidden &= RemoveToolStripItems(dropDownItem as ToolStripItem, hideCurrent);
            }
            hideCurrent |= allChildrenAreHidden;
        }
        toolStripItem.Available = !hideCurrent ;
        return hideCurrent;
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню