Я действительно решил эту проблему, но отправляю ее для потомков.
Я столкнулся с очень странной проблемой с 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 извне, чтобы снова избежать зависимости ).
Печально, что такая банально простая вещь отнимала у меня столько времени ...