为什么在C#中的FlowLayoutPanels中有时会忽略控件?

时间:2015-11-30 14:56:20

标签: c# controls ignore flowlayoutpanel

这种情况多次发生在我身上。虽然我找到了解决方法,但感觉不专业,我想知道为什么会这样。

假设我有一个FlowLayoutPanel,其中有几个按钮。

我打算遍历所有控件并检查是否满足某个条件。如果是,那么我希望删除此控件。所以我会做这样的事情:

foreach (Control c in flp_p_products.Controls)
{ 
 if(condition(c))
  flp_p_products.Controls.Remove(c);
}    

然而,不止一次,在不同的项目中,我发现一个控件设法摆脱循环并不罕见 - 我不知道为什么。

只有在我添加时才会这样 while(flp_p_controls.Count > 0)foreach...循环开始时CatchingGame所有的孩子都会循环播放。

有什么我没有意识到的吗?

2 个答案:

答案 0 :(得分:1)

从集合中删除元素并继续迭代它通常会导致InvalidOperationException。然而,这并没有为Control.ControlCollection类完成。所以出现问题的是,foreach循环会跳过你删除的控件之后的控件。

您必须向后迭代以避免此问题:

for (int ix = flp_p_products.Controls.Count - 1; ix >= 0; ix--)
{ 
    var c = flp_p_products.Controls[ix];
    // etc..
}

答案 1 :(得分:0)

这可能是因为您在迭代它的同时修改了集合。

您可以迭代集合并收集您想要影响的控件的ID。然后使用那个列表来修改控件。