Почему свойство DoubleBuffered по умолчанию имеет значение false в DataGridView и почему оно защищено? - PullRequest
15 голосов
/ 31 октября 2008

У нас была проблема с производительностью DataGridViews, когда перерисовка была ужасно медленной, и мы нашли решение Здесь , чтобы создать производный тип и включить двойную буферизацию для элемента управления. (Производный тип необходим, поскольку свойство DoubleBuffered защищено)

Кажется, что нет никакого недостатка, если свойство DoubleBuffered имеет значение true.

Ответы [ 4 ]

18 голосов
/ 31 октября 2008

Он защищен, потому что DGV наследует свойство от Control. И Control.DoubleBuffered защищен. Что имеет смысл, потому что каждый производный элемент управления должен решить для себя, чтобы включить это. И для управляющего пользователя не имеет смысла произвольно включать или выключать его. Дизайнеры DGV решили отказаться.

Одной из причин, по которой они могли бы решить, является то, что двойная буферизация на самом деле замедляет рисование. Дополнительный шаг для рендеринга растрового изображения буфера стоит времени. Это просто выглядит быстрее для человеческого глаза, вы наблюдаете внезапное появление растрового изображения. Вы не можете видеть время, необходимое для рисования в растровое изображение. Если другие элементы управления не должны быть окрашены и они получают свою очередь после DGV, то это вполне заметно.

То, что вы видите, это форма, которая рисуется первой, с отверстиями, куда идут элементы управления. Эти отверстия имеют белый фон. Черный при использовании свойства TransparencyKey или Opacity. Каждый элемент управления затем получает событие Paint, и отверстия заполняются один за другим. Этот эффект также воспринимается пользователем как мерцание, хотя этот вид мерцания отличается от того, который решает DoubleBuffered. Это особенно заметно, когда фон черный.

Для решения этой проблемы необходимо, чтобы вся форма со всеми элементами управления имела двойную буферизацию. Это не доступно в Windows Forms. Однако Windows XP и более поздние версии фактически поддерживают это. Проверьте эту ветку , чтобы увидеть, как это делается. Помните, что он может иметь побочные эффекты, описанные в этой теме.

16 голосов
/ 23 апреля 2012

Я думаю, что лучшее решение:

typeof(DataGridView).InvokeMember(
   "DoubleBuffered", 
   BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
   null, 
   myDataGridViewObject, 
   new object[] { true });

найдено здесь

5 голосов
/ 31 октября 2008

Двойная буферизация по определению использует два буфера и двойную память для рендеринга представления элемента управления. Таким образом, есть некоторый недостаток, однако, учитывая объем памяти, который вы сейчас получаете на ПК, вряд ли многие люди заметят эту жертву.

Не знаю, почему это защищено. Возможно, эта функция не была доступна в ранней версии элемента управления, и когда она была представлена, дизайнеры не хотели менять общедоступный интерфейс элемента управления. Или, возможно, они считали, что это расширенная функция, и хотели ограничить число методов, которые кто-то новичок в элементе управления должен будет использовать, чтобы иметь возможность заставить его делать что-то полезное.

4 голосов
/ 03 ноября 2009

Наследование не требуется, чтобы включить двойной буферизацию при просмотре сетки данных . Вы можете сделать это с учетом существующего представления данных.

...