foreach ( Control control in panel1.Controls)
{
    panel1.Controls.Remove(control);
}总共有10个控件,却只能删除5个隔一个删除一个,不解中;foreach ( Control control in panel1.Controls)
{
    MessageBox.Show(control.Name);
}Show得10个控件名字foreach ( Control control in panel1.Controls)
{
    panel1.Controls.Remove(control);    MessageBox.Show(control.Name);
}这样却只Show得5个控件名?????????怎么才能把控件全部删完呢

解决方案 »

  1.   

    这个你需要理解“枚举”的机制,自己亲自编写“强类型的集合”。foreach 其实被编译为循环调用枚举函数next(),这个函数返回对象。也就是说 foreach 实际上被编译器翻译为 
        while(panel1.Controls.enumerator.next())
        {
            Control control=panel1.Controls.Current;
            ......
        }
    的结构。在 Controls 等这类 Collection 中,枚举使用一个整数下标递增 1 来完成,就是说如果上一次返回的是第4个元素,那么next()就将这个下标指向5,从而 Current 属性返回第5个对象。当指针指向第4个的时候,如果你删除第4个元素,那么队列中从第5个开始所有元素都向前排了一位,但是枚举器还是指向4,程序还是照样会执行 next()。你的问题的解决:1. 
    foreach ( Control control in panel1.Controls)
    {
        MessageBox.Show(control.Name);
    }
    panel1.Controls.Clear();Clear 就够了。
    2.
    while(panel1.Controls.count()>0)
    {
        Control control= panel1.Controls[0];
        panel1.Controls.RemoveAt(0);
        MessageBox.Show(control.Name);
    }
    顺序Remove与foreach冲突。
      

  2.   

    “程序还是照样会执行 next()。”的意思是说下一位指向5了!
      

  3.   

    写错了一个字:Control control=panel1.Controls.Current;  -->  
      Control control=panel1.Controls.enumerator.Current;