2010-05-14 70 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。