忽略foreach循环中特定类型的项目

imd*_*ose -1 c# winforms drop-down-menu

我试图取消选中菜单中所有可检查的ToolStripMenuItem项目

foreach (ToolStripMenuItem item in filtersMenu.DropDownItems)
{
   item.Checked = false;
}
Run Code Online (Sandbox Code Playgroud)

ToolStripMenuItem都可以检查,但问题是编译器给出了InvalidCastException,循环也试图对ToolStripSeparator项目进行操作,如何解决这个问题,任何帮助都将不胜感激,谢谢.

Ron*_*Dex 6

只需添加一个if语句来检查项目的类型:

foreach (ToolStripItem item in filtersMenu.DropDownItems)
{
    // Move to next item if ToolStripSeparator
    if (item is ToolStripSeparator)
        continue;

    item.Checked = false;
}
Run Code Online (Sandbox Code Playgroud)


Abb*_*bas 5

你可以使用RononDex的答案,这是非常好的.你也可以这样说:

foreach(ToolStripMenuItem item in filtersMenu.DropDownItems.OfType<ToolStripMenuItem>())
{
    item.Checked = false;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

如果我没有弄错的话,RononDex的代码应该可以修改为这个(使用ToolStripItem而不是 ToolStripMenuItem:

foreach (ToolStripItem item in filtersMenu.DropDownItems)
{
    if (item is ToolStripSeparator)
        continue;

    item.Checked = false;
}
Run Code Online (Sandbox Code Playgroud)

而且有点短:

foreach (ToolStripItem item in filtersMenu.DropDownItems)
{
    if (item is ToolStripMenuItem)
        item.Checked = false;
}
Run Code Online (Sandbox Code Playgroud)

这将起作用,因为DropDownItems-property属于该类型ToolStripItemCollection.此集合包含该类型的项目ToolStripItem.此外,如果你看一下两者的继承层次ToolStripMenuItem和ToolStripSeparator,你会看到他们都继承ToolStripItem.

更多阅读: