У меня есть сетка данных с VirtualMode = true, которую я также реализовал перетаскиванием, чтобы позволить пользователю переупорядочивать строки в сетке данных. Моя проблема заключается в том, что хотя я использую SuspendLayout / ResumeLayout, представление данных все еще вызывает CellValueNeeded в середине обработки, в результате чего моя программа обрабатывает sh.
В событии DragDrop у меня есть следующий код, где ' dragRow '- исходная строка, а' row '- место назначения события перетаскивания.
gridview.SuspendLayout();
try
{
// copy dragged row
DataGridViewRow rowCopy = gridview.Rows[dragRow];
DataValue dataCopy = dataList[dragRow];
// remove dragged row
dataList.RemoveAt(dragRow);
gridview.Rows.RemoveAt(dragRow);
// insert row
dataList.Insert(row, dataCopy);
gridview.Rows.Insert(row, rowCopy);
// move selection to moved row
gridview.CurrentCell = gridview[gridview.CurrentCell.ColumnIndex, row];
}
finally { gridview.ResumeLayout(true); }
Перед началом перетаскивания моя программа обнаруживает, что пользователь выбрал последнюю строку. Я спроектировал последний ряд, чтобы он всегда был пустым по причинам, в которые я не буду здесь вдаваться. Обычно, если пользователь выбирает последнюю строку, он инициирует перетаскивание с включенной опцией DragDropEffects.Copy. Если я обнаружу, что вторая-последняя строка также пуста, то я переключаю перетаскиваемый ряд на второй-последний ряд, чтобы пользователь мог переместить пустую строку (поскольку последняя строка не может быть перемещена). Проблема возникает во время события DragDrop между тем, где строка удаляется из моего списка данных, и тем местом, куда она вставляется в новом месте, когда datagridview вызывает свое событие CellValueNeeded, в результате чего моя программа обрабатывает sh при исключении вне диапазона при попытке читать что-то из моего списка данных, которого там нет.
Я также видел эту проблему в связи с отображаемыми подсказками. Если пользователь наводит указатель мыши на строку / ячейку, которую он только что перетащил, отображаемая подсказка отображается для неправильной строки, как если бы событие CellToolTipTextNeeded было вызвано для неправильной ячейки и не обновлялось после ResumeLayout.
Is есть что-то, чего мне не хватает, чтобы я мог сообщить datagridview, что я обновляю его источник данных, находясь в режиме virtualmode?