Настройка: У меня есть два DataGridView, каждый из которых связан с BindingList <> пользовательских бизнес-объектов.Эти сетки имеют специальную строку, содержащую математические суммы всех строк в этой сетке - эта специальная строка отражает соответствующий специальный объект в BindingList <> (я указываю это, чтобы вы знали, что это не добавляемая строкав DGV, но объект добавляется в BindingList <>).
Ошибка: Периодически наступает время, когда я должен найти и удалить объект Totals Row из BindingList <> (и, следовательно, из DGV).Вот оригинальный код, который я использовал для этого:
private void RemoveTotalRow()
{
for (int i = UnderlyingGridList.Count - 1; i >= 0; i--)
{
if (UnderlyingGridList[i].IsTotalRow) UnderlyingGridList.RemoveAt(i);
}
}
(Это не супер важно, но причина, по которой я перебираю все записи, состоит в том, чтобы защитить от возможности того, что их может быть больше, чемодин итоговый ряд, по ошибке).Этот код работает безупречно для одной из двух сеток при любых обстоятельствах.Тем не менее, во второй сетке я получаю следующую ошибку при вызове метода RemoveAt:
The following exception occurred in the DataGridView: System.IndexOutOfRangeException: Index 5 does not have a value. at System.Windows.Forms.CurrencyManager.get_Item(Int32 index) at System.Windows.Forms.DataGridView.DataGridViewDataConnection.GetError(Int32 rowIndex) To replace this default dialog please handle the DataError event.
... где '5' - индекс строки итогов. Я нашел этот вопрос , который, по сути, тот же, за исключением того, что принятым ответом является либо: 1) не использовать базовый список, что я должен сделать, либо 2) удалить из таблицы вместо изсписок.Я попробовал # 2, заменив самый внутренний вызов метода из моего примера кода следующим:
if (UnderlyingGridList[i].IsTotalRow) brokenDataGrid.Rows.RemoveAt(i);
Это выдает ту же ошибку. Я также нашел этот вопрос , который предполагает повторное связывание после изменения - однако это неосуществимо, так как возможно, что этот код вызывается один раз в секунду, и если список слишком заполнен, он сделаетэнергосистема непригодна (я знаю это по плохому опыту).
Я мог бы просто обработать событие DataError сетки, но я бы предпочел, чтобы это не выдавало миллион ошибок в минуту, даже если они молчат.Любая помощь будет принята с благодарностью.