Cekaj malo, ne mozes tako da radis.
Prvo pogledaj kako radi foreach
Code:
foreach (ElementType element in collection) statement
----------------------------------------------------
Enumerator enumerator = (collection).GetEnumerator();
try {
while (enumerator.MoveNext()) {
ElementType element = (ElementType)enumerator.Current;
statement;
}
}
finally {
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose(); 39
}
Znaci malo komplikovaniji while, koji da nema foreach, bi u sustini svaki put morao sam da pises istu konstrukciju. Problem lezi u tome kada pozoves Dispose metodu nad kontrolom ona sebe brise iz parent kolekcije kontrola. Pogledaj Dispose za Control u Refelctoru, imas deo koda
Code:
if (this.parent != null)
{
this.parent.Controls.Remove(this);
}
Znaci ako imas recimo tri kontrole
1 Button
2 TextBox
3 ListBox
Kada krenes sa iteracijom, tebi ce se obrisati prvo Button, pa zatim ListBox, dok ce ti TextBox ostati u kolekciji, zbog toga sto ti menjas kolekciju dok prolazis kroz nju.
Sad, drugi problem je do greske koju dobijas, ne znam kako si poredjao kontrole i sta radis sa njima pa zato ne bi bilo lose da ostavis ceo kod, znaci i ceo onaj InitializeComponent. Jedan od mogucih problema je taj sto prilikom poziva Dispose kontrola u samoj Dispose konstrukciji, moguce je da nesto referencira na nesto sto je vec dispozovano :). Generalno postoji pravilo da Dispose niko ne treba do poziva osim onoga koji je kreirao objekat. Mada ovo sa kontrolama nije pravilo.
Da te pitam nesto. Ako vec cistis kolekciju zar nije lakse pozvati this.Controls.Clear(); ili sa
Code:
while (true)
{
// ovde neki tvoj uslov
if (this.Controls.Count == 0)
break;
this.Controls.RemoveAt(0);
}