c# 더블 버퍼를 이용하여 DataGridView 빠르게 출력하기 – Control을 상속하는 모든 객체 가능

DataGridView는 더블 버퍼로 작동할 수 있지만 이 설정이 드러나 있지는 않다. 더블 버퍼를 작동하게 하려면 아래와 같이 한다.

dataGridViewName.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(dataGridViewName, true);

더 복잡한 방법들이 있는데 위의 코드가 제일 간단하다.

DataGridView는 Control을 상속한다. Control은 DoubleBuffered 프라퍼티를 protected로 선언했다. 따라서 이 객체를 상속한 객체는 원칙적으로 이 프라퍼티에 접근할 수 없다. 이렇게 숨긴 의도는 알 수 없다. 여러 설명들이 있지만 모두 납득할 수 없는 것들이다. Control을 상속한 객체들은 모두 저 코드로 더블 버퍼를 이용할 수 있다는 게 그 근거다. 굳이 감출 필요가 없는 프라퍼티다.

GetProperty를 이용하면 여러 설정을 통해 드러나지 않은 프라퍼티를 이용할 수 있다. 아래의 두 설정을 해야 DoubleBuffered 프라퍼티를 찾을 수 있다.

BindingFlags.Instance는 static이 아닌 프라퍼티를 찾으라고 설정한다.

BindingFlags.NonPublic는 public이 아닌 프라퍼티를 찾으라고 설정한다.

위의 구문은 DataGridView를 처음 출력하기 전에 한 번 두면 된다. 대이터 바인드를 해도 리셋되지 않는다.