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

时间:2013-12-19 14:51:49

标签: c# winforms drop-down-menu

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

foreach (ToolStripMenuItem item in filtersMenu.DropDownItems)
{
   item.Checked = false;
}

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

2 个答案:

答案 0 :(得分:6)

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

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

    item.Checked = false;
}

答案 1 :(得分:5)

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

foreach(ToolStripMenuItem item in filtersMenu.DropDownItems.OfType<ToolStripMenuItem>())
{
    item.Checked = false;
}

编辑:

如果我没弄错的话,RononDex的代码应该可以修改为使用{使用ToolStripItem代替ToolStripMenuItem

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

    item.Checked = false;
}

又短一点:

foreach (ToolStripItem item in filtersMenu.DropDownItems)
{
    if (item is ToolStripMenuItem)
        item.Checked = false;
}

这将有效,因为DropDownItems - 属性属于ToolStripItemCollection类型。此集合包含ToolStripItem类型的项目。此外,如果您查看ToolStripMenuItemToolStripSeparator的继承层次结构,您将看到它们都继承自ToolStripItem

更多阅读: