Я насправді це вирішив, але публікую для нащадків.
Я зіткнувся з дуже дивною проблемою з 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 ззовні, щоб знову уникнути залежності ).
Сумно, що така тривіально проста штука з’їла стільки мого часу ...