2014-02-25 94 views
1

嗯,我已经试过this遍历的MenuStrip子项目

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)); 
    } 
} 

,但我只得到FileEditView

enter image description here

我需要达到Export(见图)及其subitem,并且可能例如改变Word的可见性。

注意:form动态更改menustrip项目,这就是为什么我需要通过它们循环。

回答

4

根据你提供的,你可以使用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 
    } 
} 

希望这将帮助你

问候

+0

好吧,我不能测试它,'item.Text'和'item.Visible''下有蓝线,“对象不包含文本定义,Visible ....” –

+1

这是因为编译器不知道类型是什么的项目在foreach循环中,而不是(var item)put(ToolStripItem项目),并试一试 – Monah

+0

Works!谢谢 –

0

为了获得在所有菜单项(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)); 
}