使用父级的C#从MenuStrip动态删除ToolStripMenuItems

时间:2014-11-10 17:42:32

标签: c# .net winforms visual-studio

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

花了几天时间思考这个,因为非常感谢你。

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,我认为以下内容对您有用。它以根菜单条RemoveMenuItems开头。它将遍历所有孩子的RemoveToolStripItems。我将它留在基类中,以防你在菜单中有非ToolStripMenuItem个对象,它仍然可以工作。 RemoveToolStripItems检查对它的调用是否强制它隐藏(如果父级需要隐藏)并且Tag不是{submodule}类型。如果满足其中任何一个条件,则其本身和所有子项都设置为Available = falseToolStripItem相当于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;
    }