2016-04-07 8 views
0

UPDATEBindung ComboBox Datenquelle mit 0 Produkte anfangs hinzugefügten Elemente später verursacht ArgumentOutOfRangeException

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).

  • Ich habe versucht, die Bindung für die Bindungsquelle zu suspendieren, bevor ich mein Element hinzufüge, und dann wieder aufgenommen, aber das hat nicht funktioniert.
  • Ich versuchte, die ComboBox vor dem Hinzufügen und Aktivieren nach dem Hinzufügen zu deaktivieren, ohne Erfolg.
  • Ich habe versucht, alle vorhandenen Bindungen vor dem Hinzufügen zu löschen und dann wieder hinzuzufügen, aber dies ist ebenfalls fehlgeschlagen. Letzteres kann ich wirklich nicht herausfinden, weil dies im Wesentlichen ein "Laden" der Anwendung zum ersten Mal simuliert, wenn die Bindungen zum ersten Mal gesetzt werden.
  • 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!

    +0

    Haben Sie versucht, die Combobox vom Ereignis selectionindexchanged abzubestellen, wenn Sie den Artikel hinzufügen und dann erneut abonnieren? – Tofystedeth

    +0

    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 :) –

    +0

    @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

    Antwort

    0

    Nachdem wir einen Freund den Code angesehen haben, haben wir die gleiche Code-Basis auf einem anderen Computer ausprobiert. Es hat gut funktioniert, ohne Änderungen.Wir haben eine Reihe von "Fixes" auf der ursprünglichen Maschine ausprobiert und schließlich hat es mit einigen Hacky-Fixes funktioniert ... Es stellte sich heraus, dass wir die Hacky-Fixes überhaupt nicht brauchten, es war ein Caching-Problem mit den Build-Dateien.

    Denken Sie daran, Kinder, REBUILD Ihr Projekt, wenn Sie Probleme haben.

    Also, um zu beachten: Es gab überhaupt kein Problem, meine Build-Dateien waren veraltet und verursachten ein fehlerhaftes Verhalten.

    0

    Mein Problem war ähnlich, aber die Lösung war anders. Ich habe die gleiche Ausnahme mit ComboBox.DataSource und BindingList, aber nur beim Debuggen, und Ausnahmen haben nicht wirklich die Ausführung gestoppt. Als ich die App gerade ausführte, gab es keine Ausnahme. Ich habe dann aktiviert "Aktivieren Sie nur meinen Code" Option in Tools> Optionen> Debugging> Allgemein und Ausnahmen waren weg.