2010-05-14 50 views
2

这段代码有什么问题?C#this.Controls.Remove problem

for (int w = 0; w < this.Controls.Count; w++) 
{ 
    if (this.Controls[w] is TransparentLabel) 
    { 
     la = (TransparentLabel)this.Controls[w]; 
     if (la.Name != "label1") 
     { 
      la.Visible = false; 
      la.Click -= new System.EventHandler(Clicked); 
      this.Controls.Remove(this.Controls[w]); 
      la.Dispose(); 
     } 
    } 
} 

我想清除标签中的屏幕,但它不起作用。

+1

它不起作用?当你运行它会发生什么? – 2010-05-14 15:41:33

+2

修改集合时始终向后循环。 – 2010-05-14 17:23:25

回答

6

我把它的代码是不是删除所有预期的控制?这是因为您要从Control集合中删除一个项目,然后增加w。

你应该后this.Controls.Remove(...);

称为w--;如果不删除,你会跨过这需要控制的地方在标志W控制控制后打电话w--;

只是要添加,你真的需要打电话给以下?

la.Visible = false; 
la.Click -= new System.EventHandler(Clicked); 
la.Dispose(); 

当您删除该控件时,它将变为不可见,并且不会被点击。如果你不重新添加它,它会超出范围并被GC收集。

为了满足批评者,你应该这样做的正确方法是通过ControlCollection向后工作。 Brian在他的answer中报道过这个问题。

+1

首先向后循环会更好。 – SLaks 2010-05-14 15:42:20

+0

确实如此。我只是解释了为什么它不起作用,我认为这是他的问题。 – GenericTypeTea 2010-05-14 15:47:01

+0

有趣,不会有那一个+1 – Yoda 2010-05-14 15:53:20

7

更改为到:

for (int w = this.Controls.Count - 1; w >= 0; w--) 

否则,你可能会得到有关修改控件的错误。否则,如果这没有帮助,并且控件在屏幕上,那么它将与您的if语句评估一起使用。调试将有助于解决这个问题。

0

值得怀疑CF是否支持LINQ,所以你可以做下一个:

this.Controls 
    .OfType<TransparentLabel>() 
    .Where(c => c.Name != "label1") 
    .ToList() 
    .ForEach(c => this.Controls.Remove(c)); 
0

ctrl.Visible = FALSE;

它解决了我有同样的问题。呈现页面时不输出HTML。