用foreach移除窗体控件的问题

来源:百度知道 编辑:UC知道 时间:2024/06/05 16:05:50
假设在窗体上放了6个button的控件,执行如下代码
private void button1_Click(object sender, EventArgs e)
{

foreach (Control control in this.Controls)
{
this.Controls.Remove(control);
}
}
控件还有剩余啊
怎么回事

这个是因为foreach逻辑引起的。举个例子,你的六个button的id如下
Controls[0].Name=Button1
Controls[1].Name=Button2
Controls[2].Name=Button3
Controls[3].Name=Button4
Controls[4].Name=Button5
Controls[5].Name=Button6
那么在foreach的过程中,第一次删除的是Controls[0],也就是Button1,
那么下一次他删除的将是Controls[1],但是,这个时候注意,实际上Controls对象已经变了,各个id如下
Controls[0].Name=Button2
Controls[1].Name=Button3
Controls[2].Name=Button4
Controls[3].Name=Button5
Controls[4].Name=Button6
所以,第二次实际上删除的是Button3,因此Button2被保留下来。。依次类推,总是有button会被保留下来。
不晓得解释清楚没有。。

细仔看一下MS的东西,再作东西好吗

MS是这样说的“foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。 ”
你现在的作法就是不可预知的副作用。
要是想删除所有你可以使用
int count=this.Controls.Count;
for (int i = 0; i < count; i++)
{
this.Controls.RemoveAt(0);
}
或使用Controls.Clear();

this.Controls.Clear()

这样不就可