这种情况多次发生在我身上。虽然我找到了解决方法,但感觉不专业,我想知道为什么会这样。
假设我有一个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
,所有的孩子都会循环播放。
有什么我没有意识到的吗?
答案 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。然后使用那个列表来修改控件。