ListBox, выбрасывающий ArgumentOutOfRangeException при добавлении в DataSource - PullRequest
4 голосов
/ 20 декабря 2010

Я пытаюсь использовать BindingList в качестве DataSource для ListBox в C # WinForms, но всякий раз, когда я пытаюсь добавить элементы в BindingList, я получаю ArgumentOutOfRangeException брошенный.Следующий код демонстрирует проблему (примите форму с ListBox listBox1):

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

Обратите внимание, что если в dataSource уже есть элементы, я не получаю исключение:

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

Я могу обойти эту проблему, установив для свойства DataSource значение null перед добавлением элемента и заново установив DataSource после этого, но это похоже на хак, и я хотел бы иметь возможностьчтобы избежать этого.

Есть ли (не взломанный) способ использовать пустой DataSource на ListBox, чтобы при добавлении элементов к нему не создавались исключения?

Редактировать : Трассировка стека:

System.Windows.Forms.dll! System.Windows.Forms.ListBox.SelectedIndex.set (значение int) + 0x1ec байт
System.Windows.Forms.dll! System.Windows.Forms.ListControl.DataManager_PositionChanged (отправитель объекта, System.EventArgs e) + 0x2e байт
System.Windows.Forms.dll! System.Windows.Forms.CurrencyManager.OnPositionChanged (System.EventArgs e) + 0x39 байт
System.Windows.Forms.dll! System.Windows.Forms.CurrencyManager.ChangeRecordState (int newPosition, проверка bool, bool endCurrentEdit, bool firePositionChange, bool pullData) + 0x14f байт
System.Windows.Forms.dll! System.Windows.Forms.CurrencyManager.List_ListChanged (объекта отправителяe) + 0x2e4 байта
System.dll! System.ComponentModel.BindingList.OnListChanged (System.ComponentModel.ListChangedEventArgs e) + 0x17 байтов
System.dll! System.ComponentModel.BindingList.FireListLedCedCedComтип, индекс int) + 0x35 байт
System.dll! System.ComponentModel.BindingList.InsertItem (индекс int, System ._ элемент Canon) + 0x3f байт
mscorlib.dll! System.Collections.ObjectModel.Collection.Add (System.
_Canon item) + 0x76 байт

Ответы [ 3 ]

2 голосов
/ 21 декабря 2010

Оказывается, я проверил все в диалоге «Исключения» (Debug-> Exceptions). Таким образом, исключение существует, но (молча) обрабатывается платформой .Net. Продолжение выполнения программы отображает ожидаемые результаты.

0 голосов
/ 05 ноября 2014

У меня была та же проблема, и после нескольких исследований я обнаружил, что единственным способом избежать этой ошибки .Net было назначение только BindingList источнику данных, когда список не пуст.

Если он может измениться, вы можете создать фиктивный объект, который вы всегда сохраняете в списке, и вы удалили его, когда список не пуст.

Наконец, не стоит искать способ избежать появления ArgumentOutOfRangeException.

0 голосов
/ 20 декабря 2010

Возможно, к вашему событию ListBox подключен обработчик событий, который может быть причиной этого? Я не могу воспроизвести поведение, которое вы описываете.

Я создал полностью пустой проект WinForms с одним ListBox, связанным с BindingList<string>, добавил значение «Test» в список (после установки свойства ListBox.DataSource), и появился пункт «Test» в коробке, как и ожидалось.

Я бы посмотрел на ваш ListBox, а также на BindingList<string>, чтобы узнать, есть ли у какого-либо из них обработчики событий, которых вы могли бы пропустить.

...