现在要删除panel控件里的所有子控件,郁闷了两小时
第一:原本以为直接调用Clear方法就可以了,但实际上不行的,调试的时候,调用完Clear后,查看其子控件是显示为0,但窗体上还是保留着,还没立即释放,要等窗体关闭后,通过析构函数来释放,所以满足不了我的需求,不能立即生效。
第二:发现Clear方法不行后,然后自己写个foreach循环,结果是没有遍历完所有子控件就停止了,看了下.NET源码,原因如下:
【注1】 看了下ControlCollection的MoveNext源码,果然没有检查集合的改变: public bool MoveNext() { if ((this.current < (this.controls.Count - 1)) && (this.current < (this.originalCount - 1))) { this.current++; return true; } return false; } 当你迭代完第二个元素后,this.controls.Count等于3-2=1,this.current=1,迭代就停止了。实际上集合中还有两个元素。 最后解决办法:Queue<Control> query = new Queue<Control>();//临时存储获取到的control控件 /// <summary> /// 递归获取panel1上的所有控件,并临时存储到一个队列中 /// </summary> /// <param name="item"></param> void DS(Control item) { for (int i = 0; i < item.Controls.Count;i++ ) { if (item.Controls[i].HasChildren) { DS(item.Controls[i]); } else { query.Enqueue(item.Controls[i]); } } } private void button1_Click(object sender, EventArgs e) { DS(panel1); //删除遍历到的控件 while (query.Count != 0) { query.Dequeue().Dispose(); } }
参考:http://www.cnblogs.com/steed-zgf/archive/2012/04/03/2430819.html