2010-12-20 13 views
4

Ich versuche, ein BindingList als DataSource für ein ListBox in WinForms C# verwenden, aber wenn ich versuche, Artikel hinzufügen zu den BindingList, erhalte ich ein ArgumentOutOfRangeException geworfen. Der folgende Code demonstriert das Problem (unter der Annahme ein Formular mit ListBox listBox1):ListBox ArgumentOutOfRangeException werfen, wenn Datasource Hinzufügen

BindingList<string> dataSource = new BindingList<string>(); 
listBox1.DataSource = dataSource; 
dataSource.Add("Test1"); // Exception, here. 

Beachten Sie, dass, wenn dataSource bereits Elemente in ihm, ich habe nicht die Ausnahme erhalten:

BindingList<string> dataSource = new BindingList<string>(); 
dataSource.Add("Test1"); 
listBox1.DataSource = dataSource; 
dataSource.Add("Test2"); // Appears to work correctly. 

Ich kann um die Arbeit Problem, indem Sie die DataSource Eigenschaft auf null setzen, bevor Sie ein Element hinzufügen und die DataSource nachher zurücksetzen, aber das fühlt sich an wie ein Hack, und ich möchte in der Lage sein, dies zu vermeiden.

Gibt es eine (nicht-hack) Möglichkeit, ein leeres DataSource auf einem ListBox zu verwenden, so dass das Hinzufügen von Elementen keine Ausnahmen auslöst?

bearbeiten: Stack Trace:

System.Windows.Forms.dll System.Windows.Forms.ListBox.SelectedIndex.set (int Wert) + 0x1ec Bytes
System.Windows. Forms.dll! System.Windows.Forms.ListControl.DataManager_PositionChanged (Objekt Absender, System.EventArgs e) + 0x2e Bytes
System.Windows.Forms.dll! System.Windows.Forms.CurrencyManager.OnPositionChanged (System.EventArgs e) + 0x39 Bytes
System.Windows.Forms.dll! System.Windows.Forms.CurrencyManager.ChangeRecordState (int newPosition, bool Validieren, bool EndCurrentEdit, bool firePositionChange, bool pullData) + 0x14f
System.Windows.Forms Bytes. dll! System.Windows.Forms.CurrencyManager.List_ListChanged (Objekt Absender, System.ComponentModel.ListChangedEventArgs e) + 0x2e4 Bytes
System.dll! System.ComponentModel.BindingList.OnListChanged (System.ComponentModel.ListChangedEventArgs e) + 0x17 Byte
System.dll! System.ComponentModel.BindingList.FireListChang ed (System.ComponentModel.ListChangedType Typ, int index) + 0x35 Bytes
System.dll! System.ComponentModel.BindingList.InsertItem (int Index, System._ Canon Artikel) + 0x3f Bytes
mscorlib.dll ! System.Collections.ObjectModel.Collection.Add (System.
_Canon Artikel) + 0x76 Bytes

+0

Keine Repro, die Stack-Ablaufverfolgung der Ausnahme post. –

+1

Ich fühle mich irgendwie dumm - es ist eine Ausnahme, die .Net intern behandelt; Mein Debugger wurde so eingestellt, dass er bei allen ausgelösten Ausnahmen ausgelöst wird. Beim nächsten Mal werde ich sicher "weitermachen", bis ich einen tatsächlichen Absturz bekomme. – TreDubZedd

Antwort

2

Es stellte sich heraus, dass ich im Dialogfeld "Ausnahmen" alles überprüft hatte (Debug-> Exceptions). Die Ausnahme existiert also, wird aber (stillschweigend) vom .NET Framework verarbeitet. Die fortlaufende Programmausführung zeigt die erwarteten Ergebnisse an.

0

Sie möglicherweise Sie einen Event-Handler auf ein Ereignis auf Ihrem ListBox angebracht haben, dass dies verursacht werden könnte? Ich kann das beschriebene Verhalten nicht reproduzieren.

habe ich ein völlig leeres WinForms-Projekt, mit einer einzigen ListBox an ein BindingList<string> gebunden ist, den Wert „Test“ in die Liste aufgenommen (nach der ListBox.DataSource-Eigenschaft), und der Punkt „Test“ erschien in der Box, als erwartet.

Ich würde einen Blick auf Ihre ListBox sowie Ihre BindingList<string> werfen, um zu sehen, ob einer Sie einige angehängte Event-Handler hat, die Sie möglicherweise vermissen.

+0

Mein Problem besteht in der scheinbar gleichen Konfiguration, die Sie beschreiben, d. H. Brandneue WinForms-Projekte mit einer einzelnen ListBox; keine irrelevanten Event-Handler. – TreDubZedd

+0

@TreDubZedd: Und das ist ein Standard 'System.Windows.Forms.ListBox'? Im Moment bin ich bei Hans - kann nicht reproduzieren, was du siehst. Ein Stack-Trace wäre auf jeden Fall hilfreich. –

+0

Es sieht so aus, als wäre es eine Ausnahme, die .Net intern behandelt. Hoppla. – TreDubZedd

0

Ich hatte das gleiche Problem und nach mehreren Recherchen fand ich, dass die einzige Problemumgehung, um diesen .Net-Fehler zu vermeiden, war, nur die BindingList der DataSource zuzuweisen, wenn die Liste nicht leer ist.

Wenn es sich ändern kann, können Sie ein Dummy-Objekt erstellen, das Sie immer in der Liste behalten, und Sie haben es entfernt, wenn die Liste nicht leer ist.

Schließlich lohnt es sich nicht, einen Weg zu finden, um zu vermeiden, dass ArgumentOutOfRangeException ausgelöst wird.