나는 실제로 이것을 해결했지만 후세를 위해 게시하고 있습니다.
듀얼 모니터 시스템에서 DataGridView에 매우 이상한 문제가 발생했습니다. 이 문제는 컨트롤의 매우 느린 다시 그리기로 나타납니다 ( 전체 다시 그리기의 경우 30 초 정도 ).하지만 내 화면 중 하나에있을 때만 나타납니다. 다른 경우에는 다시 그리기 속도가 좋습니다.
최신 비 베타 드라이버 (175. 무언가)가있는 Nvidia 8800 GT가 있습니다. 드라이버 버그입니까? 이 특정 구성으로 살아야하므로 공중에 남겨 두겠습니다. (하지만 ATI 카드에서는 발생하지 않습니다 ...)
페인트 속도는 셀 내용과 관련이 없으며 사용자 정의 드로잉은 단색 사각형을 그리는 경우에도 성능을 전혀 향상시키지 않습니다.
나중에 System.Windows.Forms.Integration 네임 스페이스의 ElementHost를 폼에 배치하면 문제가 해결된다는 사실을 알게되었습니다. 엉망이 될 필요는 없습니다. DataGridView도있는 형식의 자식이어야합니다. Visible 속성이 true이면 크기를 (0, 0)으로 조정할 수 있습니다 .
내 응용 프로그램에 .NET 3 / 3.5 종속성을 명시 적으로 추가하고 싶지 않습니다. 리플렉션을 사용하여 런타임시 (가능한 경우)이 컨트롤을 만드는 방법을 만듭니다. 작동하고 최소한 필요한 라이브러리가없는 머신에서는 정상적으로 실패합니다. 단지 느려진 상태로 돌아갑니다.
이 방법을 사용하면 앱이 실행되는 동안 수정을 적용 할 수 있으므로 내 양식에서 WPF 라이브러리가 변경되는 내용을 쉽게 확인할 수 있습니다 (Spy ++ 사용).
많은 시행 착오 끝에 컨트롤 자체에서 이중 버퍼링을 활성화하면 (단지 형식이 아닌) 문제가 해결된다는 것을 알았습니다!
따라서 DoubleBuffering을 활성화 할 수 있도록 DataGridView를 기반으로 사용자 지정 클래스를 만들기 만하면됩니다. 그게 다야!
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}
그리드의 모든 인스턴스가이 사용자 정의 버전을 사용하는 한 모두 정상입니다. 이로 인해 하위 클래스 솔루션을 사용할 수없는 상황이 발생하면 (코드가없는 경우) 해당 컨트롤을 폼에 삽입 할 수 있다고 가정합니다. :) ( 'I 있지만, 다시 한 번 종속성을 피하기 위해 DoubleBuffered 속성을 외부에서 강제로 사용하도록 리플렉션을 사용하려고 시도 할 가능성이 더 높습니다 .
그렇게 사소한 일이 내 시간을 너무 많이 먹은 것이 슬프다 ...