2009-06-29 10 views
2

Hallo!
Ich habe 11 Panels in jeder Registerkarte einer Tabcontrol und möchte 10 Panels entfernen. so schrieb ich diesen Code:
Entfernen der Steuerelemente Programmatisch funktioniert nicht wie erwartet!

 var PnlsToRemove = tabControl.SelectedTab.Controls.OfType<Panel>() 
      .Where(p => !p.Name.StartsWith("BasePanel")); 
     foreach (var pnl in PnlsToRemove) 
      pnl.Dispose(); 

aber nach Verfolgung fragte ich mich, dass entfernen, um alternative ist !!!
bedeutet, dass, wenn der obige Code läuft, nur die Felder 0,2,4,6,8,10 entfernt werden und die anderen bleiben.
so sollte ich meinen Code in einer Schleife gelegt Platten wie diese abwechselnd zu entfernen:

while (tabControl.SelectedTab.Controls.OfType<Panel>().Count() != 1) 
    { 
     var PnlsToRemove = tabControl.SelectedTab.Controls.OfType<Panel>() 
      .Where(p => !p.Name.StartsWith("BasePanel")); 
     foreach (var pnl in PnlsToRemove) 
      pnl.Dispose(); 
    } 

in diesem Fall (10 Platten), während() 4 mal Schleifen alle Platten zu entfernen.

HINWEIS: alle meine Panels existieren in "PnlsToRemove" und dieser Fehler tritt bei der Ausführung von "PnlsToRemove" in foreach.

Also, was ist falsch mit meinem Code ???
Warum foreach() vom nächsten Panel springt ???

ich denke, alles ist klar!

Antwort

5

Die zugrunde liegende Sammlung wird mutiert, wenn Sie die Bereiche aus der Liste entfernen, was sich offensichtlich in den Werten widerspiegelt, die von "foreach" gesehen werden. Die Lösung besteht darin, die Werte in einer neuen Sammlung zu speichern und darüber zu iterieren. Sie können dies tun, indem Sie eine ".ToList()" zu Ihrer Definition von PnlsToRemove

+0

ich verwendet .ToList () nach Ihren Ratschlägen. und es hat gut funktioniert. aber ich habe nicht unterschätzt, was das Problem war? bedeutet, warum "mutiert werden, wie ich die Panels von der Liste entfernen"? – mahdiahmadirad

+2

Viele LINQ-Methoden führen zu einer verzögerten Auswertung, was bedeutet, dass sie keine Kopie einer zugrunde liegenden Enumeration erstellen, wenn sie dies nicht tun müssen. Stellen Sie sich vor, Sie haben ein Array, und anstatt es zu kopieren, merken Sie sich einfach einen Index. Die Operation "get next element" erhöht den Index und gibt den nächsten Wert aus dem Array zurück. Wir beginnen mit dem Element Null. Es wird zurückgegeben und der Index wird auf eins aktualisiert. Aber jetzt entfernen Sie das Element Null aus dem Array. Was also der Index eins ist, ist der Index zwei. usw. –

+0

Danke. Ich habe verstanden. – mahdiahmadirad

Verwandte Themen