为什么!这不会处理流程面板上的所有物体吗?

时间:2010-10-28 19:11:28

标签: c# winforms .net-4.0

WHY!这不会处理流程面板上的所有物体!? 计数显示5,表单上有5个buttonsWithProperties,表单上没有其他对象。

foreach (ButtonWithProperties itemButton in flowLayoutPanel1.Controls)
        {
            itemButton.Dispose();
        }

它处理3个对象但不包括最后2个...

1 个答案:

答案 0 :(得分:2)

Dispose()一个有实时引用的对象(在可视化树中)来说,这确实是一种不好的做法。如果要删除按钮,则可能必须以有序的方式将其从Controls中删除。请参阅http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.removeat.aspx

编辑:
请注意,该按钮为IDisposable,因此RemoveAt版本需要明确Dispose

var controls = flowLayoutPanel1.Controls;
for (int i = controls.Count - 1; i >= 0; --i)
{
    var c = controls[i];
    if (c is ButtonWithProperties)
    {
        flowLayoutPanel1.Controls.RemoveAt(i);
        c.Dispose();
    }
}

编辑:
The documentation表示即使使用Dispose,也应调用Clear。因此,如果您不再需要按钮,则应Dispose()