【问题标题】:Why are controls sometimes ignored in FlowLayoutPanels in C#?为什么有时在 C# 的 FlowLayoutPanels 中会忽略控件?
【发布时间】:2015-11-30 14:56:19
【问题描述】:

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

假设我有一个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... 循环的开头,所有的孩子都被循环了。

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

【问题讨论】:

    标签: c# controls flowlayoutpanel


    【解决方案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..
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-08-16
        • 1970-01-01
        • 2018-05-27
        • 2022-10-14
        • 1970-01-01
        • 1970-01-01
        • 2012-05-10
        • 1970-01-01
        • 2017-08-22
        相关资源
        最近更新 更多