C# winform 删除某个控件上的子控件

  现在要删除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=1this.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值