Właściwie to rozwiązałem, ale wysyłam to dla potomności.
Napotkałem bardzo dziwny problem z DataGridView w moim systemie z dwoma monitorami. Problem objawia się BARDZO powolnym przemalowywaniem kontrolki ( np. 30 sekund w przypadku pełnego odmalowania ), ale tylko wtedy, gdy jest na jednym z moich ekranów. Z drugiej strony prędkość odświeżania jest dobra.
Mam Nvidię 8800 GT z najnowszymi sterownikami innymi niż beta (175. coś). Czy to błąd sterownika? Zostawię to w powietrzu, ponieważ muszę żyć w tej konkretnej konfiguracji. (Nie zdarza się to jednak na kartach ATI ...)
Szybkość malowania nie ma nic wspólnego z zawartością komórki, a niestandardowe rysowanie w ogóle nie poprawia wydajności - nawet podczas malowania zwykłego prostokąta.
Później dowiedziałem się, że umieszczenie elementu ElementHost (z przestrzeni nazw System.Windows.Forms.Integration) w formularzu rozwiązuje problem. Nie trzeba się z tym bawić; musi po prostu być elementem podrzędnym formularza, w którym znajduje się również DataGridView. Można zmienić jej rozmiar na (0, 0), o ile właściwość Visible ma wartość true.
Nie chcę jawnie dodawać zależności .NET 3 / 3.5 do mojej aplikacji; Tworzę metodę tworzenia tej kontrolki w czasie wykonywania (jeśli to możliwe) przy użyciu odbicia. Działa, a przynajmniej zawodzi wdzięcznie na maszynach, które nie mają wymaganej biblioteki - po prostu wraca do powolnego działania.
Ta metoda pozwala mi również zastosować poprawki, gdy aplikacja jest uruchomiona, dzięki czemu łatwiej jest zobaczyć, co biblioteki WPF zmieniają się w moim formularzu (przy użyciu Spy ++).
Po wielu próbach i błędach zauważyłem, że włączenie podwójnego buforowania w samym formancie (a nie tylko w formularzu) rozwiązuje problem!
Wystarczy więc utworzyć niestandardową klasę opartą na DataGridView, aby móc włączyć jej DoubleBuffering. Otóż to!
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}
Tak długo, jak wszystkie moje instancje gridu używają tej niestandardowej wersji, wszystko jest w porządku. Jeśli kiedykolwiek napotkam sytuację spowodowaną przez to, że nie będę w stanie użyć rozwiązania podklasy (jeśli nie mam kodu), przypuszczam, że mógłbym spróbować wstrzyknąć tę kontrolkę do formularza :) ( chociaż ja ' Bardziej prawdopodobne jest, że spróbujemy użyć odbicia, aby wymusić włączenie właściwości DoubleBuffered z zewnątrz, aby ponownie uniknąć zależności ).
To smutne, że tak banalnie prosta rzecz pochłonęła tyle mojego czasu ...