2016-05-24 8 views
0

Nach diesem "foreach" getan entfernen, gibt es noch Tasten in panelGroups.Controlsdynamische Steuerung von Panel funktioniert nicht

foreach (Button button in panelGroups.Controls) 
{ 
    panelGroups.Controls.Remove(button); 
} 

Debug-Modus in Visual Studio: Debug mode in Visual Studio

+3

Ich bin sicher, dass dies eine 'InvalidOperationException' verursacht, weil Sie die Enumeration (' Controls') ändern, die Sie gerade durchlaufen ('foreach'). Und wenn Sie in diesem Panel einen 'Control' haben, der kein' Button' ist und nicht von 'Button' geerbt wurde, erhalten Sie auch eine' InvalidCastException'. –

+0

Nun, ich habe "panelGroups.Controls.Clear();" und es funktioniert, in diesem Fall habe ich nur Tasten und ich muss alle Steuerelemente entfernen, damit es gut für mich ist, aber vielleicht für andere Fälle wird es nicht nützlich sein. –

+0

Also sehen Sie meine Antwort, sollte für Sie arbeiten. –

Antwort

1

Der Code zeigen Sie ist sehr fehleranfällig:

  1. Wenn es eine Control in Ihrem panelGroups.Controls ist, dass kein Button ist und n ot geerbt von Button, wird Ihr Code eine InvalidCastException werfen. Das ist, weil Sie versuchen, jeden Control in dieser Platte in eine Button zu werfen, die beispielsweise für eine Label

  2. Sie versuchen, scheitern wird eine Aufzählung zu ändern (von Remove Aufruf) während Sie durch sie iterieren. Dies verursacht eine InvalidOperationException.

Sie versuchen, es besser so:

foreach(Button button in panelGroups.Controls.OfType<Button>().ToList()) 
    panelGroups.Controls.Remove(button); 

von OfType<Button>() verwenden Sie nur die Steuerelemente aus dem Panel auswählen, die wirklich Button sind.
Durch Aufruf von ToList() schließen Sie diese Iteration ab, um die Schaltflächen von Controls auszuwählen, bevor Sie die Iteration über den resultierenden Button-Satz starten.

Auf diese Weise würden Sie die Ausnahmen vermeiden und Ihr Code sollte funktionieren.

Hinweis jedoch, dass dies nur für Button s funktioniert, die direkt in Ihrem panelGroups enthalten sind. Wenn Sie in diesem Bereich andere Container (wie Panels oder Groupboxes) haben, die mehr Schaltflächen enthalten, werden diese Schaltflächen auf diese Weise nicht aufgelistet. Sie müssten die Container durchforsten und diese Knöpfe aus der Sammlung der Container Controls entfernen.

Verwandte Themen