2016-07-29 25 views
0

Ich habe einige Benutzersteuerelemente erstellt, die ich in VS 2013 programmgesteuert auf einem Formular ablege. Diese Steuerelemente müssen gelegentlich gelöscht und neu erstellt werden. Ich habe versucht, die Steuerelemente auf zwei verschiedene Arten zu löschen. Man arbeitet, man nicht. Ich hoffe, dass jemand einen Einblick geben kann, warum der eine nicht funktioniert.Entfernen von Steuerelementen aus einem Formular C#

Diese Version nicht funktioniert (es nur zwei von vier Kontrollen findet):

// delete user controls from the front panel 
foreach (UserControl ctrl in this.Controls.OfType<StationControl>()) 
{ 
    this.Controls.Remove(ctrl); 
} 

Diese Version funktioniert (es vier von vier Kontrollen findet):

// delete user controls from the front panel 
var uc_list = this.Controls.OfType<StationControl>().ToArray(); 
foreach (var ctrl in uc_list) 
{ 
    this.Controls.Remove(ctrl); 
} 

ich kann zählen die Anzahl der Benutzer steuert die Art ohne Ausgabe passend (zB

int controlCount = this.Controls.OfType<StationControl>().Count() 

warum also die erste foreach st atment nicht voll arbeiten?

+2

Denn im ersten Beispiel, Sie Steuerelemente aus der gleichen Kollektion werden entfernt, wo Sie sind überschleifen. In der zweiten Schleife durchlaufen Sie eine andere Sammlung und entfernen sie aus der Formularsteuerungssammlung. – Steve

+0

Mögliches Duplikat von [Element innerhalb von 'foreach' effizient löschen] (http://stackoverflow.com/questions/8791557/efficiently-deleting-item- von-innerhalb-foreach) –

Antwort

0

Funktioniert das?

foreach (UserControl ctrl in this.Controls.OfType<StationControl>()) 
{ 
    ctrl.Dispose(); 
    this.Controls.Remove(ctrl); 
} 

Ich hoffe, das hilft.

Edit:

Die oben funktioniert nicht richtig, hier ist ein Arbeitsansatz:

while (this.Controls.OfType<StationControl>().Count() > 0) 
{ 
    UserControl ctrl = this.Controls.OfType<StationControl>().First(); 

    ctrl.Dispose(); 
    this.Controls.Remove(ctrl); 
}