[英]Dynamically adding ToolStripMenuItems to a MenuStrip (C#/ Winforms)
[英]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 = 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.