假设Form窗休中有3个按扭  执行如下代码 
foreach(Control item in this.Controls)
{
   this.Controls.Remove(item);
}
为什么不能一次性移除窗体中的控件

解决方案 »

  1.   

     this.Controls.Clear(); 就可以全部移除所有控件。
      

  2.   

    为装silverlight,2005卸了无法帮你试了。
    看看是不RemoveAt
      

  3.   

    你是不是用了单击某个button然后移除所有控件啊。
    好像是因为这个button被移除后,它的Click事件就不再执行了。
    直接放在页面的paint中就可移除所有控件。
      

  4.   

    但是,我要保留几个控件.
      比如
    foreach(Control item in this.Controls)
    {
       if(item.Name!="btnExit")
       {
          this.Remove(item);
       }
    }
    却达不到我的效果,控件除了btnExit外还有别的控件
      

  5.   

    细看MS才知道 foreach是这么定义的
    foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用
    我想我就是受到副作用了
      

  6.   


    this.Controls集合被你改变了。foreach 不能正确枚举了。
      

  7.   

    改用 for 循环:for (int i = 0; i < this.Controls.Count; i++) 

      if (this.Controls[i].Name != "btnExit") 
      { 
        this.Controls.Remove(this.Controls[i]); 
      } 
      

  8.   

    想了一下,用 for 循环可能仍然会有副作用。这样比较稳妥:List<Control> list = new List<Control>();
    foreach (Control item in Controls) 

      if (item.Name != "btnExit") 
      { 
        list.Add(item); 
      } 
    }
    foreach (Control item in list) 
    {
      Controls.Remove(item); 
    }
      

  9.   

    引楼上的this.Controls.Clear(); 就可以全部移除所有控件。
    就可以了
    其次检查你的控件是否包含在容器中比如panle 
      

  10.   


    List<Control> list = new List<Control>();
    foreach (Control item in Controls) 

      if (item.Name != "btnExit") 
      { 
        list.Add(item); 
      } 
    }
    foreach (Control item in list) 
    {
      Controls.Remove(item); 
    }多开一个list不要开销吗?
     int x = this.Controls.Count() - 1;
     for (int i = x; i < 0; x--)
       {
         if (this.Controls[i].Name != "btnExit")
          {
             this.Controls.Remove(this.Controls[i]);
          }
       }从集合的最后一个找起,如果符合条件踢出去就是了。
      

  11.   

    恩,  确实...发现不能先直接删除....要把它放到集合中...
    可能foreach里面移除机制就像list下表一样...移除一个2的下标原来下标3的值就跑到2了,应该是算法问题....貌似系统这样的算法目的是提高它的效率吧
      

  12.   


    那也应该是 i >= 0; i-- for (int i = x; i >= 0; i--)
      

  13.   


    晕:
    Count 后面的 () 也必须去掉。
      

  14.   

            public void RemoveControl(string name)
            {
                List<Control> list = new List<Control>();
                foreach (Control c in this.Controls)
                {
                    if (c.Name != name) // 此处修改可以改变想删除的对象.
                        list.Add(c);
                }
                foreach (Control c in list)
                {
                    this.Controls.Remove(c);
                }        }
            public void RemoveControl(string name)
            {
                for ( int i =this.Controls.Count-1 ;i>=0 ;i--)
                {   
                    if  (this.Controls[i].Name != name )
                        this.Controls.Remove(this.Controls[i]);
                }
            }
    无聊,把上两个方法整理了下.