对于stackoverflow的所有社区,您今天来找我,请求帮助解决我尝试了几天的问题。
我需要找到能够找到子节点的递归算法,否则必须删除/隐藏父节点(子模块)。 Parent Objects有一个名为:submodule的标签。 子对象有一个名为:moduleoption
我有以下情况:
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控件。
我的代码:
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;
}
花了几天时间思考这个,因为非常感谢你。
答案 0 :(得分:0)
如果我正确理解了您的问题,我认为以下内容对您有用。它以根菜单条RemoveMenuItems
开头。它将遍历所有孩子的RemoveToolStripItems
。我将它留在基类中,以防你在菜单中有非ToolStripMenuItem
个对象,它仍然可以工作。 RemoveToolStripItems
检查对它的调用是否强制它隐藏(如果父级需要隐藏)并且Tag不是{submodule}类型。如果满足其中任何一个条件,则其本身和所有子项都设置为Available = false
(ToolStripItem
相当于Visible = False
)。如果隐藏了所有子项,则控件还将Available设置为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;
}