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

Why are controls sometimes ignored in FlowLayoutPanels in C#?

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

假设我有一个 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... 循环开始时 所有 的 children 都循环了。

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

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

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

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

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

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