Цикл по подпунктам в меню

Ну, я попробовал это:

private IEnumerable<ToolStripMenuItem> GetItems(ToolStripMenuItem item)
{
    foreach (ToolStripMenuItem dropDownItem in item.DropDownItems)
    {
        if (dropDownItem.HasDropDownItems)
        {
            foreach (ToolStripMenuItem subItem in GetItems(dropDownItem))
                yield return subItem;
        }
        yield return dropDownItem;
    }
}

private void button2_Click_1(object sender, EventArgs e)
{
    List<ToolStripMenuItem> allItems = new List<ToolStripMenuItem>();
    foreach (ToolStripMenuItem toolItem in menuStrip1.Items)
    {
        allItems.Add(toolItem);
        MessageBox.Show(toolItem.Text);
        allItems.AddRange(GetItems(toolItem));
    }
}

но я только получаю File, Edit, View

мне нужно достичь Export (см. рисунок) и его subitemи, возможно, изменить видимость Word например.

Обратите внимание form изменяет menustrip пункт динамически, поэтому мне нужно перебрать их.

2 ответа

Решение

Основываясь на предоставленной вами информации, вы можете использовать linq как

var exportMenu=allItems.FirstOrDefault(t=>t.Text=="Export");
if(exportMenu!=null)
{
    foreach(ToolStripItem item in exportMenu.DropDownItems) // here i changed the var item to ToolStripItem
    {
         if(item.Text=="Word") // as you mentioned in the requirements
              item.Visible=false; // or any variable that will set the visibility of the item
    }
}

надеюсь, что это поможет вам

С уважением

Чтобы получить все пункты меню (экземпляры ToolStripMenuItem) в вашем MenuStrip, используйте следующий код (я предполагаю, что имя MenuStrip - menuStrip1)

// Get all the top menu items, e.g. File , Edit and View
List<ToolStripMenuItem> allItems = new List<ToolStripMenuItem>();
foreach (ToolStripMenuItem item in menuStrip1.Items)
{
   // For each of the top menu items, get all sub items recursively
    allItems.AddRange(GetItems(item)); 
}
Другие вопросы по тегам