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