Как сохранить виртуальный режим отображения данных от вызова cellvalueneeded при обновлении данных в фоновом режиме в C# - PullRequest
0 голосов
/ 12 марта 2020

У меня есть сетка данных с 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?

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