Es scheint dies noch etwas anderes sein kann. Es gibt eine BindingList von Accounts, die an eine ListBox gebunden sind. Wenn der Benutzer ein Konto auswählt, werden seine Abrechnungszeiträume in der ComboBox angezeigt (nach denen sie die Rechnungen für jede Periode anzeigen können). Bevor ich sogar versuche, ein Element zu einer leeren Liste hinzuzufügen, die an die ComboBox gebunden ist, wenn ich von einem Konto, das einen bereits bestehenden Abrechnungszeitraum geladen hat, auf einen anderen ohne Abrechnungszeitraum umschalte und dann versuche, die gleiche Ausnahme zurückzuschalten ist geworfen. Die folgenden Informationen beziehen sich auf das Szenario, in dem ich zu einem Konto wechseln möchte, für das noch kein Abrechnungszeitraum besteht, und versuchen, ein neues Konto hinzuzufügen. Ich habe etwas mehr Code hinzugefügt, um die Bindung für die ListBox anzuzeigen, wenn es hilft.
END UPDATE
Ich laufe in dem, was scheint eine einfache Frage, aber ich kann nicht herausfinden, wie es weitergeht. Ich habe eine ComboBox
Daten an eine BindingList
(gekapselt von einem BindingSource
) gebunden, die Abrechnungsperiode Objekte enthält. Die Objekte enthalten ihre eigenen BindingLists
, die Inhalte dieser Listen werden in einem Raster (als Rechnungen) angezeigt. Auf diese Weise, wenn der Benutzer einen Abrechnungszeitraum auswählt, spiegelt das Raster die korrekten Rechnungen für den Zeitraum wider.
Hier ist die Bindung Code:
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;
Nicht alle Konten wird eine bereits bestehende Abrechnungszeitraum haben, so dass die ComboBox wird auf eine leere Liste binden. Wenn ich wähle über Periods.Add(period)
zu einem späteren Zeitpunkt einen Abrechnungszeitraum für diese leeren Listen hinzuzufügen, erhalte ich die folgende Ausnahme:
Exception thrown: 'System.ArgumentOutOfRangeException' in System.Windows.Forms.dll
Additional information: InvalidArgument=Value of '0' is not valid for 'SelectedIndex'.
Also habe ich im Internet einige der Suche und ich fand, dass durch einen Artikel auf die Zugabe von Datenquelle einer ComboBox, selbst wenn sie leer ist, löst sie das SelectedIndexChanged-Ereignis aus. Ist sie jedoch leer, ist ein SelectedIndex von '0' ungültig, weil dieser Index auf das erste Element verweist (was im Hinblick auf den Ausnahmetext Sinn macht).
Mein Problem ist dann das: Ich möchte mein bindendes Verhalten beibehalten, um das ComboBox-Element beizubehalten, das die angezeigten Rechnungen ändert. Ich kann mir keinen Weg vorstellen, dies zu tun, oder ich habe mir keine Gedanken darüber gemacht, wo es nicht über eine anfänglich leere Datenquelle stolpert. Idealerweise bin ich dafür, dass die ComboBox nur dann bindet, wenn die zugrunde liegende Datenquelle nicht leer ist (um diesen Fehler zu vermeiden).
Die einzige andere Sache, die ich denken kann, ist die ComboBox und Datengitter manuell ohne Bindung zu verwalten, aber das wird ein großer Schmerz sein. Gibt es keinen anderen Weg? Es muss geben!
Haben Sie versucht, die Combobox vom Ereignis selectionindexchanged abzubestellen, wenn Sie den Artikel hinzufügen und dann erneut abonnieren? – Tofystedeth
Es ist schwer, eine solche Frage zu beantworten oder zu helfen, das Problem zu finden. Es ist besser, einen wirklich einfachen Code zu posten, um das Problem zu reproduzieren :) –
@Tofistedeth Ich abonniere das 'SelectedIndexChanged' Ereignis selbst nicht, es wird implizit von der' ComboBox' Klasse behandelt. Ich habe auch den Designer-Code überprüft und sehe nicht, dass Visual Studio einen Event-Handler abonniert hat. Die einzige Möglichkeit, mich abzumelden, ist wie folgt: 'combobox.SelectedIndexChanged - = eventHandler', aber' eventHandler' ist noch nicht abonniert, also bin ich mir nicht sicher, ob das funktioniert. @RezaAghaei Ich werde etwas auspeitschen. – Fam