2016-04-07 7 views
0

GÜNCELLEMECilt ComboBox başlangıçta sonradan eklenen öğeler başka bir şey olabilir görünen ArgumentOutOfRangeException

neden olur. ListBox'a bağlı bir BindingList hesabı var. Kullanıcı bir hesap seçtiğinde, fatura dönemleri ComboBox'ta gösterilir (bundan sonra her bir dönem için faturaları görebilirler). Önceden bir faturalama süresine sahip olan bir hesaba geçip faturalandırma dönemi olmayan bir hesaba geçiş yaparsam ve sonra da aynı istisna geri dönmeyi denediğimde, ComboBox'a bağlı boş bir listeye bir öğe eklemeyi denemeden önce Atıldı. Aşağıdaki bilgiler, önceden mevcut bir fatura dönemine sahip olmayan bir hesaba geçip yeni bir tane eklemeye çalıştığım senaryo içindir. Yardımcı olursa, ListBox için bağlamayı göstermek için daha fazla kod ekledim.

SON GÜNCELLEME

Ben basit bir konu gibi görünüyor ne içine çalıştırıyorum ama devam anlamaya olamaz. Faturalandırma dönemi nesnelerini içeren BindingList (BindingSource ile enkapsüle edilmiş) bir ComboBox veri var. Nesneler kendi BindingLists içerir, bu listelerin içeriği bir ızgarada (fatura olarak) görüntülenir. Bu şekilde kullanıcı bir fatura dönemini seçtiğinde, şebeke dönem için doğru faturaları yansıtır. İşte

bağlayıcı kodudur:

BindingSource bs = new BindingSource(Controller, "Accounts"); 
listAccounts.DataSource = bs; 
listAccounts.DisplayMember = "Name"; 

BindingSource source = new BindingSource(bs, "Periods"); 
comboPeriod.DataSource = source; 
comboPeriod.DisplayMember = "DisplayPeriod"; 

BindingSource src = new BindingSource(source, "Bills"); 
gridPaymentSchedule.DataSource = src; 

önceden varolan faturalama dönemi tüm hesaplar olacak değil, bu yüzden ComboBox boş listeye bağlanacaktır. Ben Periods.Add(period) yoluyla daha sonraki bir noktada bu boş listelere bir fatura dönemini eklemeyi tercih, ben şu istisna olsun:

Exception thrown: 'System.ArgumentOutOfRangeException' in System.Windows.Forms.dll 

Additional information: InvalidArgument=Value of '0' is not valid for 'SelectedIndex'. 
Yani

Ben bazı web üzerinde arama yaptım ve buldum bir öğe ekleyerek Bir ComboBox veri kaynağı, boş olsa bile, SelectedIndexChanged olayını tetikler, ancak boş olduğunda, bu indeks ilk maddeye (istisna metni göz önüne alındığında anlam ifade eder) başvurduğu için '0' SelectedIndex geçersizdir.

Sorunum o zaman: Bu, görüntülenen faturaları değiştirerek ComboBox öğesini korumak için bağlayıcı davranışımı korumak istiyorum. Bunu yapmanın bir yolunu düşünemiyorum ya da tamamen boş bir veri kaynağının üzerinden geçmediği bir yer bulamadım. İdeal olarak, gideceğim davranış, temel veri kaynağı boş olmadıkça (bu hatayı önlemek için) ComboBox'ın bağlanmadığıdır.

  • Öğe eklemeden önce ciltleme kaynağının ciltlenmesini askıya almayı denedim ve devam ettim, ancak bu çalışmadı.
  • Eklenti eklemeden önce ekleyip etkinleştirmeden önce ComboBox'ı devre dışı bırakmayı denedim.
  • Eklemeden önce varolan tüm bağları silmeyi ve sonra yeniden eklemeyi denedim, ancak bu da başarısız oldu. Bu sonuncusu gerçekten anlayamıyorum, çünkü bu, ilk defa bağlamanın ilk ayarlandığı anda uygulamanın bir "yükünü" simüle ediyor.

Düşünebildiğim tek şey, ComboBox ve veri ızgarasını el ile yönetmeksizin elle yönetmek, ancak bu büyük bir acı olacaktır. Başka yolu yok mu? Olmak zorunda!

+0

Öğeyi eklerken combobox seçiminden çıkmış olaydan çıkıp sonra yeniden abone olmayı denediniz mi? – Tofystedeth

+0

Bu soruyu cevaplamak ya da sorunu bulmak zor. Sorunu çoğaltmak için gerçekten basit bir kod göndermek daha iyidir :) –

+0

@Tofystedeth 'SelectedIndexChanged' etkinliğine abone değilim, 'ComboBox' sınıfı tarafından örtük olarak ele alınmıştır. Ayrıca tasarımcı kodunu kontrol ettim ve Visual Studio'nun bir olay işleyicisine abone olduğunu görmedim. Abonelikten çıkmayı bildiğim tek şey şu şekildedir: "combobox.SelectedIndexChanged - = eventHandler" ancak "eventHandler" zaten abone değil, bu yüzden işe yarayacağından emin değilim. @RezaAghaei Bir şeyler fırlatacağım. – Fam

cevap

0

Bir arkadaşınızın kodu inceledikten sonra, aynı kod tabanını farklı bir makinede denedik. Hiçbir değişiklik olmadan iyi çalıştı.Orijinal makinede bir takım "düzeltmeler" denedik ve son olarak bazı hacky düzeltmeleri ile çalıştık ... Görünüşe göre hacky düzeltmelerine hiç gerek yoktu, bu da derleme dosyaları ile önbellekleme sorunuydu.

Sorunları yaşıyorsanız, çocukları projenizi REBUILD unutmayın.

Not: Dikkat edilmesi gereken bir şey yoktu, derleme dosyalarım güncel değildi ve hatalı davranışlara neden oluyordu.

0

Sorunum benzerdi ama çözüm farklıydı. Bu aynı istisnayı, ComboBox.DataSource ve BindingList ile aldım, ancak yalnızca hata ayıklama ve istisnalar gerçekten yürütmeyi durdurmadığı zaman. Sadece uygulamayı çalıştırdığımda bir istisna yoktu. Daha sonra Araçlar> Seçenekler> Hata Ayıklama> Genel'da "Kodum Etkinleştir" seçeneğini etkinleştirdim ve istisnalar giderildi.