簡體   English   中英

使用父級的C#從MenuStrip動態刪除ToolStripMenuItems

[英]Dynamically Remove ToolStripMenuItems from MenuStrip with parent's C#

在所有stackoverflow社區中,您好,我今天是來找您的,以幫助我解決幾天來試圖解決的問題。

我需要找到一個能夠找到子代的遞歸算法,如果沒有,則必須刪除/隱藏父代(子模塊)。 父對象具有一個名為:子模塊的標簽。 子對象有一個叫做: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 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 我將其留在基類中,以防菜單中仍然有非ToolStripMenuItem對象,它仍然可以工作。 RemoveToolStripItems檢查對它的調用是否不強制其隱藏(如果父項需要隱藏),以及該Tag是否不是{submodule}類型。 如果滿足這兩個條件之一,則其自身和所有子項都將設置為Available = false (等效於Visible = FalseToolStripItem 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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM