Modification of the answer Vale. Separators will not break this version, and they will also be returned (menuStripItems is ToolStripItemCollection, i.e.: this.MainMenuStrip.Items):
/// <summary> /// Recursively get SubMenu Items. Includes Separators. /// </summary> /// <param name="item"></param> /// <returns></returns> private IEnumerable<ToolStripItem> GetItems(ToolStripItem item) { if (item is ToolStripMenuItem) { foreach (ToolStripItem tsi in (item as ToolStripMenuItem).DropDownItems) { if (tsi is ToolStripMenuItem) { if ((tsi as ToolStripMenuItem).HasDropDownItems) { foreach (ToolStripItem subItem in GetItems((tsi as ToolStripMenuItem))) yield return subItem; } yield return (tsi as ToolStripMenuItem); } else if (tsi is ToolStripSeparator) { yield return (tsi as ToolStripSeparator); } } } else if (item is ToolStripSeparator) { yield return (item as ToolStripSeparator); } }
Fill out the list:
List<ToolStripItem> allItems = new List<ToolStripItem>(); foreach (ToolStripItem toolItem in menuStripItems) { allItems.Add(toolItem); //add sub items allItems.AddRange(GetItems(toolItem)); }
Complete the list:
foreach(ToolStripItem toolItem in allItems) { if(toolItem is ToolStripMenuItem) { ToolStripMenuItem tsmi = (toolItem as ToolStripMenuItem); //Do something with it } else if(toolItem is ToolStripSeparator) { ToolStripSeparator tss = (toolItem as ToolStripSeparator); //Do something with it } }
source share