Сценарий:
В основном у меня есть
System.Windows.Forms.DataGridView
Класс, который наследует BindingSource и IBindingList
Класс, который имеет 2 стандартных списка как частные свойства
DataGridView dgv = new ...
MyBindingSource bindingSource = new ...
MyList list = new ...
Свойство DataGridView.DataSource устанавливается на BindingSource, а свойство BindingSource.DataSource устанавливается на один из закрытых списков списка
bindingSource.DataSource = list.ListA;
dgv.DataSource = bindingSource;
Я получаю кучу информации, поступающей из базы данных, и я преобразовываю информацию в объекты и добавляю ее в MyList по одному, и в конце она должна отображаться в DataGridView.
Надеюсь, все это имело смысл, теперь проблема:
После добавления одного объекта в список (не источника привязки) я хочу, чтобы элемент отображался в DataGridView. Но единственный способ, которым я в настоящее время могу заставить это работать, состоит в том, чтобы создать другой экземпляр bindingSource с добавленным новым объектом и установить DataGridView.DataSource на новый bindingSource. Это конечно ужасно неэффективно, и представление данных должно каждый раз аннулировать все это, что является хитрым.
Вместо этого я хочу, чтобы List уведомлял BindingSource, который сообщает DataGridView о добавлении нового объекта, чтобы он мог выполнять свои функции. Я пробовал это, но я продолжал получать исключение IndexOutOfrange, говорящее «Элемент с индексом -1 не имеет значения».
Я посмотрел на BindingSource, и в действительности позиция была -1, а свойство Current вызвало то же исключение. Когда я создаю новый BindingSource каждый раз, когда свойства position и Current верны.
Итак, что мне нужно сделать, чтобы эти свойства обновлялись при добавлении элемента в список? Я открыл его с помощью рефлектора, чтобы увидеть, где он был установлен, и выглядел так, будто «CurrencyManager» как-то с этим связан. Я попробовал несколько вещей, таких как base.OnDataMemberChanged base.OnListChanged безрезультатно.
Редактировать: Забыл упомянуть, что я получаю исключение, только когда я щелкаю строку в представлении таблицы данных, он добавляет элементы в порядке. Так что, как будто DataGridView не синхронизирован с BindingSource