Я на самом деле решил это, но я отправляю его для потомков.
Я столкнулся с очень странной проблемой с DataGridView на моей системе с двумя мониторами. Проблема проявляется как ЧРЕЗВЫЧАЙНАЯ медленная перерисовка управления (например, 30 секунд для полной перерисовки), но только когда она находится на одном из моих экранов. Когда с другой стороны, скорость перерисовки прекрасна.
У меня есть Nvidia 8800 GT с последними не-бета-драйверами (175.). Это ошибка драйвера? Я оставлю это в воздухе, так как я должен жить с этой конкретной конфигурацией. (Этого не происходит на картах ATI, хотя...)
Скорость рисования не имеет ничего общего с содержимым ячейки, и пользовательский чертеж не улучшает производительность вообще - даже когда вы просто рисуете сплошной прямоугольник.
Позже я узнаю, что размещение ElementHost (из пространства имен System.Windows.Forms.Integration) в форме исправляет проблему. Его не нужно путать; он просто должен быть дочерним элементом формы DataGridView. Он может быть изменен до (0, 0) до тех пор, пока свойство Visible истинно.
Я не хочу явно добавлять зависимость .NET 3/3.5 к моему приложению; Я создаю метод создания этого элемента управления во время выполнения (если возможно) с использованием отражения. Он работает, и, по крайней мере, он изящно терпит неудачу на машинах, которые не имеют требуемой библиотеки - он просто возвращается к медленному.
Этот метод также позволяет мне применять исправление во время работы приложения, что упрощает просмотр изменений библиотек WPF в моей форме (с помощью Spy ++).
После большого количества проб и ошибок я замечаю, что включение двойной буферизации в самом элементе управления (в отличие от только формы) исправляет проблему!
Итак, вам просто нужно создать собственный класс, основанный на DataGridView, чтобы вы могли включить его DoubleBuffering. Что это!
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}
Пока все мои экземпляры сетки используют эту пользовательскую версию, все хорошо. Если я столкнулся с ситуацией, вызванной этим, когда я не могу использовать решение подкласса (если у меня нет кода), я полагаю, что я мог бы попытаться ввести этот элемент управления в форму:) (хотя я ' будет более вероятно, чтобы попытаться использовать отражение, чтобы заставить свойство DoubleBuffered снаружи, чтобы снова избежать зависимости).
Печально, что такая тривиально простая вещь так сильно поглотила мое время...