2015-12-03 24 views
7

Not: Bu zaten işe yaramaz, ancak anlamaya çalışıyorum Neden bu şekilde çalışıyor, ancak diğeri değil.Kod karışıklığı - neden çalışıyor, ama diğeri değil?

Dinamik, görüntüleri koymak şöyle bir WinForm (C#) var: Eğer 'Napred' butonuna tıklayın Şimdi eğer enter image description here

, bu görüntüler, (diğer şeyler arasında) silinmesi gerektiğini kendisi için Başlangıçta kullandı: Ben bu çalıştırırsanız

foreach(Control ctrl in Controls) 
    if(ctrl is PictureBox) ctrl.Dispose(); 

veya

for(int i = 0; i < Controls.Count; i++) 
    if(Controls[i] is PictureBox) Controls[i].Dispose(); 

Şimdi, olsun:

Sadece geriye göndermek for deyimi değiştirirseniz

enter image description here

Ama, bu çalışır ?

for(int i = Controls.Count - 1; i >= 0; i--) if(Controls[i] is PictureBox) Controls[i].Dispose(); 

((Ben sadece düğmeleri) sonunda sol olsun ben başka bir resim yüklemek için gitmiyorum, ama bu elementlerin hepsi siler)

bir çalışır neden

birisi aydınlatmak bana ama diğer değil mi?

DÜZENLEME: Bu bir hata ayıklama hatası bile olsa, Windows 10 üzerinde VS2015 topluluk edition kullanıyorum

+0

kullanırken bu nedenle her zaman bu davranışı bulamazsınız çoğu bertaraf yöntemleri ile behavour varsayılan ve sonra Öğe1'ı silmek değil ve kalan 9 öğeniz olacak. Dizi öğelerinin standart olarak atılması yöntemi, geriye doğru adım atmaktır. – LightBulb

+0

Diğer yaklaşımlar için ilgi çekici olabilir: http://stackoverflow.com/questions/7340757/c-sharp-list-removing-items-while-looping-iterating –

+0

Neden yöntemi kaldırmıyorsunuz? –

cevap

12

Elbette değişecek olan sen yineleme ediyoruz listesini değiştirmeye çalışıyorsun (?) Bu listenin indeksleri, yani indeks 1'de olan şey şu anda 0 dizinindedir.

Dizinin sonundan (yani tersi) çıkarılarak önceki indeksler her zaman aynı olacaktır.)

Control.Dispose (özeldir ve Üst konteynerin Kontroller listesinden kontrol kaldıracaktır: Önemli da

Onun Matthew Watson'ın açıklamada belirtildiği gibi nota.

Bu Item2 yeni Öğe1 olacak, 10 maddeden dizisi varsa Dispose

+1

Anladım, bu yüzden her 2. öğe siliniyor. Netleştirdiğiniz için teşekkürler! Aklımdan hiç geçmedi! – NemanjaT

+2

Sanırım yinelediği listeyi nasıl değiştirdiği konusunda net olmalısınız, çünkü sadece kodu incelemekle doğrudan listeden öğeleri kaldırmıyor. Cevap, 'Control.Dispose() 'özel bir denetimdir ve kontrolü bir ana içeriğin' Denetimleri' listesinden kaldırır. –

+0

@MatthewWatson - Çok doğru, kendileri listelerine referans olarak bu jenerik tutmak için çalışıyordum – Sayse

İlgili konular