代码之家  ›  专栏  ›  技术社区  ›  Max

Foreach MenuStrip中的每个子项

  •  7
  • Max  · 技术社区  · 12 年前

    我想得到所有的 SubItems MenuStrip ,所以我可以一次全部更改。

    我正在尝试以下方法,但它们不起作用:

    foreach (ToolStripMenuItem toolItem in menuStrip1.DropDownItems)
    {
          //Do something with toolItem here
    }
    

    有人能帮我编一个好的吗 foreach loop 为了得到所有 SubMenuItems(DropDownItems) 来自 主菜单 ?

    EDIT现在尝试使用以下内容 Recursive method :

    private void SetToolStripItems(ToolStripItemCollection dropDownItems)
            {
                try
                {
                    foreach (object obj in dropDownItems)
                    {
                        if (obj.GetType().Equals(typeof(ToolStripMenuItem)))
                        {
                            ToolStripMenuItem subMenu = (ToolStripMenuItem)obj;
    
                            if (subMenu.HasDropDownItems)
                            {
                                SetToolStripItems(subMenu.DropDownItems);
                            }
                            else
                            {
    
                            }
                        }
                    }
                }
                catch
                {
    
                }
            }
    
    8 回复  |  直到 12 年前
        1
  •  8
  •   Max    11 年前

    试试这个:

    List<ToolStripMenuItem> allItems = new List<ToolStripMenuItem>();
    foreach (ToolStripMenuItem toolItem in menuStrip.Items) 
    {
        allItems.Add(toolItem);
        //add sub items
        allItems.AddRange(GetItems(toolItem));
    }  
    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;
        }
    }
    
        2
  •  6
  •   Soenhay    11 年前

    修改淡水河谷的回答。分隔符不会使此版本崩溃,它们也会被返回(menuStripItems是一个ToolStripItemCollection.ie: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);
            }
        }
    

    填充列表:

        List<ToolStripItem> allItems = new List<ToolStripItem>();
        foreach (ToolStripItem toolItem in menuStripItems)
        {
           allItems.Add(toolItem);
           //add sub items
           allItems.AddRange(GetItems(toolItem));
        }
    

    循环列表:

         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
              }
         } 
    
        3
  •  2
  •   Mārtiņš Radiņš    12 年前

    你似乎无法用直接的“前臂”方法来做到这一点。我想我想通了。

    List<ToolStripMenuItem> l = new List<ToolStripMenuItem> { };
            l.Add(menuItem1);
            l.Add(menuItem2);
    
            foreach (ToolStripMenuItem m in l)
            {
                m.Text = "YourTextHere";
            }
    

    手动将菜单项添加到列表中有点野蛮,但使用“foreach”或“for”或其他循环会给我带来同样的错误。关于枚举的一些内容。他们似乎无法自己计算所有菜单项:P另一方面,如果你有分隔符和其他东西之类的菜单项,那就不太像一个简单的菜单项了,把它们都放在一个列表中并试图重命名会带来另一个问题。

    这是为了更改菜单项上显示的文本,但您可以使用此方法对它们执行任何您想要的操作。

        4
  •  1
  •   Mathew Thompson    12 年前

    实际上你的打字错了, DropDownItems 包含的集合 ToolStripItem 集合 ToolStripMenuItem .

    请尝试以下操作:

    foreach (ToolStripItem toolItem in menuStrip1.DropDownItems)
    {
        //do your stuff
    }
    

    或者在您的功能中:

    private void SetToolStripItems(ToolStripItemCollection dropDownItems)
    {
        foreach (ToolStripItem item in dropDownItems)
        {
            if (item.HasDropDownItems)
            {
                SetToolStripItems(item.DropDownItems);
            }
        }
    }
    
        5
  •  1
  •   chappjc    9 年前

    对于.net 4.5及更高版本,我已经使用它来获取特定toolstripmenuitem的下拉项。

    foreach (var genreDropDownItem in this.toolStripMenuItem_AddNewShowGenre.DropDownItems)
        {
            if (genreDropDownItem is ToolStripMenuItem) //not a ToolStripSeparator
            {
                ToolStripDropDownItem genreItem = (genreDropDownItem as ToolStripDropDownItem);
    
                genreItem.Click += toolStripMenuItem_Genre_Click; //add the same click eventhandler to all dropdownitems of parent item this.toolStripMenuItem_AddNewShowGenre
            }
        }
    
        6
  •  0
  •   Brett    10 年前

    下面是一个扩展类,用于获取所有 ToolStripMenuItem 这里的优点是所有代码都在一个递归方法中。如果需要其他菜单项类型,可以很容易地将其转换为通用方法。

    public static class ToolStripItemCollectionExt
    {
        /// <summary>
        /// Recusively retrieves all menu items from the input collection
        /// </summary>
        public static IEnumerable<ToolStripMenuItem> GetAllMenuItems(this ToolStripItemCollection items)
        {
            var allItems = new List<ToolStripMenuItem>();
            foreach (var item in items.OfType<ToolStripMenuItem>())
            {
                allItems.Add(item);
                allItems.AddRange(GetAllMenuItems(item.DropDownItems));
            }
            return allItems;
        }
    }
    
        7
  •  -1
  •   nvoigt    12 年前

    请注意,“不工作”是一个非常低效的描述。您应该发布错误消息或行为。

    foreach(var item in menuStrip1.Items)
    {
     // do something with item... maybe recursively   
    }
    

    对此有一个很好的解释 here

        8
  •  -1
  •   Tunaki    8 年前

    这里有一个非常简单的解决方案

    foreach (Control Maincontralls in MDIParent1.ActiveForm.Controls) //start it from the form - in this example i started with MDI form
    {
        if (Maincontralls.GetType() == typeof(MenuStrip)) // focus only for menu strip
        {
            MenuStrip ms = (MenuStrip)Maincontralls; //convert controller to the menue strip contraller type to access its unique properties
    
            foreach (ToolStripMenuItem subitem in ms.Items ) // access each items
            {
    
                if (subitem.Name == "loginToolStripMenuItem") subitem.Text = "Change text in loginToolStripMenuItem";
                //focus controller by its name and access its properties or whatever you wants
            }
            break; //break out the loop of controller of the form coz u don't need to go through other controllers
        }
    
    }
    
    推荐文章