Проблема привязки к данным объекта DataGridView «Индекс -1 не имеет значения» - PullRequest
4 голосов
/ 17 сентября 2009

Я использую набор DataGridViews (dgv) для отображения членов класса через свойства. Я использую dgv, чтобы пользователь мог редактировать значение члена прямо в представлении (поэтому мне не нужно отображать форму или текстовое поле для редактирования этого значения).

Структура класса, который я показываю, выглядит следующим образом

 Class1 (Displayed in a list view)
     Collection Of class2 (Displayed in a dgv, we'll call it dgv1)
          Collection of class3 (Displayed in a dgv, we'll call it dgv2)

Class3 существует, потому что коллекция строк не отображается как строки в dgv. (Длина отображается в dgv.

Class2 и Class3 имеют строковые свойства, которые я хочу редактировать в dgv, поэтому они являются единственными значениями, отображаемыми в dgv.

Когда я добавляю новый экземпляр class2 или class3 в соответствующий родительский класс, я перепривязываю dgv, отображающий коллекцию.

После добавления нового экземпляра класса он появляется в dgv, но если я выберу значение (щелкнув по нему в dgv), я получу исключение о том, что «Индекс -1 не имеет значения»

Проблема не возникает, если я сохраняю информацию, отредактированную в форме, а затем снова открываю форму. Значения, которые я не мог ранее отредактировать, можно редактировать без проблем.

Ответы [ 4 ]

10 голосов
/ 19 декабря 2010

Я знаю, что этот вопрос старый, но:

Если вы изначально связываете пустую коллекцию, которая не сообщает DGV об изменениях (например, Collection не делает, а BindingList делает), начальное текущее смещение строки будет правильно установлен на -1, (потому что он пуст.)

Когда вы впоследствии добавите объекты в свою коллекцию, связанную с данными, они по-прежнему будут правильно отображать в сетке, но CurrencyManager не будет информирован о каких-либо изменениях и текущем смещении строки останется упрямым на -1.

Итак, когда вы пытаетесь редактировать строку, CurrencyManager думает, что вы пытаетесь редактировать строку со смещением -1, и возникает исключение.

Чтобы бороться с этим, вам необходимо выполнить повторную привязку перед взаимодействием со строкой или сначала связать коллекцию и т. Д., Если она содержит один или несколько элементов.

0 голосов
/ 09 сентября 2016

Я только недавно столкнулся с очень похожей проблемой «Индекса -1» в очень простом приложении, которое делало «отображение только» выбираемых наборов данных. Это была моя вина, так как я использовал List, который работал просто отлично, пока вдруг это не сработало. Переключение на BindingList разрешило его.

0 голосов
/ 12 июня 2015

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

0 голосов
/ 24 января 2014

Я изменил свой источник данных с List (Of T) на List (Of T) .ToArray ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...