为什么有时会在 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..
}
这在我身上发生过很多次。虽然我找到了解决方法,但感觉不专业,我想知道为什么会这样。
假设我有一个 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..
}