Почему свойство DoubleBuffered по умолчанию имеет значение false в DataGridView и почему оно защищено?

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

Не похоже, что есть какой-либо недостаток в том, что для свойства DoubleBuffered установлено значение true.


person Karg    schedule 31.10.2008    source источник


Ответы (4)


Я считаю его лучшим решением:

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

нашел здесь

person Dawid Moś    schedule 23.04.2012
comment
Вопрос в том, почему для него установлено значение false, а не как его переопределить. - person Karg; 24.04.2012
comment
Хотя может быть полезно для тех, кто ищет, как включить двойной буфер. - person Barshan Das; 29.08.2016

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

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

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

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

person Hans Passant    schedule 31.10.2008
comment
Интересно, что в случае datagridview без двойной буферизации перерисовка элемента управления занимает 2-3 секунды, но с двойной буферизацией это выглядит мгновенно. - person Karg; 03.11.2008
comment
кстати, проголосуйте за ответ на защищенную часть вопроса - person Karg; 03.11.2008
comment
На самом деле двойная буферизация делает это значительно быстрее ... достаточно быстро, чтобы невооруженный глаз мог легко заметить разницу. Я ценю этот ответ, потому что это может быть наиболее `` правильный '' вариант, но он не так практичен, как просто использование отражения для установки изменения параметра в DataGridView. - person Brandon Moore; 19.06.2013
comment
Моя проблема в том, что когда я изменяю свою форму для использования этого производного класса вместо обычного, редактор ресурсов больше не будет отображать эту форму. - person Andrew Truckle; 07.06.2016

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

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

person Scott Langham    schedule 31.10.2008

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

person Community    schedule 03.11.2009