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!
Öğeyi eklerken combobox seçiminden çıkmış olaydan çıkıp sonra yeniden abone olmayı denediniz mi? – Tofystedeth
Bu soruyu cevaplamak ya da sorunu bulmak zor. Sorunu çoğaltmak için gerçekten basit bir kod göndermek daha iyidir :) –
@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