Привет всем сообществу 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;
}
Это заняло несколько дней, размышляя об этом, так как заранее большое спасибо.
Если я правильно понял ваш вопрос, я думаю, что для вас будет работать следующее. Он начинается с 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;
}