预览MenuStrip中的每个子项我想获取我的MenuStrip的所有子项,这样我就可以一次更改它们。我正在尝试以下方法,但它们不起作用:菜单栏?编辑现在尝试使用以下递归方法:privatevoidSetToolStripItems(ToolStripItemCollectiondropDownItems){;如果(subMenu.HasDropDownItems){SetToolStripItems(subMenu.DropDownItems);}else{}}}}catch{}}试试这个:ListallItems=newList();foreach(ToolStripMenuItemtoolIteminmenuStrip.Items){allItems.添加(工具项);//添加子项allItems.AddRange(GetItems(toolItem));}privateIEnumerableGetItems(ToolStripMenuItemitem){foreach(ToolStripMenuItemdropDownIteminitem.DropDownItems){if(dropDownItem.HasDropDownItems){foreach(ToolinGetItems(dropDownItem))yield返回子项;}yieldreturndropDownItem;}}修改Vale的答案Separators不会使这个版本崩溃,它们也会被返回(menuStripItems是一个ToolStripItemCollection。即:this.MainMenuStrip.Items)://////递归获取子菜单项。包括分隔符。/////////privateIEnumerableGetItems(ToolStripItemitem){if(itemisToolStripMenuItem){foreach(ToolStripItemtsiin(itemasToolStripMenuItem).DropDownItems){if(tsiisToolStripMenuItem){if((tsiasToolStripMenuItem).HasDropDownItems){foreach(ToolStripItemsubIteminGetItems((tsiasToolStripMenuItem)))yieldreturnsubItem;}yieldreturn(tsiasToolStripMenuItem);}elseif(tsiisToolStripSeparator){yieldreturn(tsiasToolStripSeparator);}}}elseif(itemisToolStripSeparator){yieldreturn(itemasToolStripSeparator);}}填充列表:ListallItems=newList();foreach(ToolStripItemtoolIteminmenuStripItems){allItems.Add(toolItem);//添加子项allItems.AddRange(GetItems(toolItem));}循环列表:foreach(ToolStripItemtoolIteminallItems){if(toolItemisToolStripMenuItem){ToolStripMenuItemtsmi=(toolItemas工具条菜单项);//用它做点什么}elseif(toolItemisToolStripSeparator){ToolStripSeparatortss=(toolItemasToolStripSeparator);//Dosomethingwithit}}看来你不能用直接的“foreach”方法来做到这一点我想我明白了。列表l=新列表{};l.添加(菜单项1);l.添加(菜单项2);foreach(ToolStripMenuItemminl){m.Text="YourTextHere";手动将菜单项添加到列表中有点野蛮,但使用“foreach”或“for”或其他循环给了我同样的错误。关于枚举的一些事情。看起来他们自己无法计算所有菜单项:P另一方面,如果您有分隔符之类的项目,它不像一个简单的菜单项,将它们全部放在列表中并尝试重命名问另一个问题。这是为了改变菜单项上显示的文本,但你可以用这个方法做任何你想做的事。实际上你的类型是错误的,DropDownItems包含ToolStripItems的集合,而不是ToolStripItems的集合。试试这个:foreach(ToolStripItemtoolIteminmenuStrip1.DropDownItems){//doyourstuff}或者在你的函数中:.DropDownItems);对于.net4.5及更高版本,我使用它来获取特定工具线程的下拉项。foreach(vargenreDropDownIteminthis.toolStripMenuItem_AddNewShowGenre.DropDownItems){if(genreDropDownItemisToolStripMenuItem)//不是ToolStripSeparator{ToolStripDropDownItemgenreItem=(genreDropDownItemasToolStripDropDownItem);genreItem.Click+=toolStripMenuItem_Genre_Click;//将相同的点击事件处理程序添加到父项的所有下拉项this.toolStripMenuItem_AddNewShowGenre}}请注意,“不起作用”是一个非常低效的描述。您应该发布错误消息或行为。foreach(variteminmenuStrip1.Items){//dosomethingwithitem...mayberecursively}这里有一个很好的解释下面是一个扩展类来获取所有ToolStripMenuItems。这里的优点是所有代码都在一个递归方法中。如果需要其他菜单项类型,这可以很容易地转换为通用方法。publicstaticclassToolStripItemCollectionExt{//////从输入集合中递归检索所有菜单项///publicstaticIEnumerableGetAllMenuItems(thisToolStripItemCollectionitems){varallItems=newList();foreach(variteminitems.OfType()){allItems.Add(item);allItems.AddRange(GetAllMenuItems(item.DropDownItems));}返回所有项目;这是一个很简单的解决方案上面是C#学习教程:预览MenuStrip中的每个Subitem分享如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——foreach(在MDIParent1.ActiveForm.Controls中控制Maincontralls)//从表单开始-在这个例子中,我从MDI表单开始{if(Maincontralls.GetType()==typeof(MenuStrip))//只关注菜单条{MenuStripms=(MenuStrip)主控制器;//将控制器转换为菜单条控制器类型以访问其独特的属性inloginToolStripMenuItem";//通过它的名称聚焦控制器并访问它的属性或任何你想要的}break;//打破表单控制器的循环因为你不需要通过其他控制器}}这篇文章来自网络采集,不代表立场,如涉及侵权,请点击右侧联系管理员删除如转载请注明出处:
