visual uso studio propiedades net form eventos ejemplos .net winforms datagridview doublebuffered

.net - uso - ¿Por qué la propiedad DoubleBuffered es falsa en DataGridView y por qué está protegida?



propiedades de datagridview (4)

Por definición, el búfer doble usa dos búferes y el doble de la memoria para mostrar la vista del control. Por lo tanto, hay un inconveniente allí, sin embargo, con la cantidad de memoria que obtienes en una PC ahora, no muchas personas probablemente notarían el sacrificio.

No tengo idea de por qué está protegido. Tal vez la función no estaba disponible en una versión anterior del control, y cuando se presentó, los diseñadores no quisieron cambiar la interfaz pública del control. O tal vez lo consideraron como una función avanzada y querían limitar el número de métodos que alguien nuevo en el control tendría que asimilar para poder hacer algo útil.

Tuvimos un problema de rendimiento con DataGridViews, donde el redibujado fue terriblemente lento y encontramos la solución Aquí para crear un tipo derivado y habilitar el almacenamiento en búfer doble en el control. (El tipo derivado es necesario ya que la propiedad DoubleBuffered está protegida)

No parece que haya ningún inconveniente para tener la propiedad DoubleBuffered establecida en verdadero.


Está protegido porque DGV hereda la propiedad de Control. Y Control.DoubleBuffered está protegido. Lo cual tiene sentido porque cada control derivado debería decidir por sí mismo activarlo. Y no tiene sentido que el usuario del control la active o desactive arbitrariamente. Los diseñadores de DGV decidieron desactivarlo.

Una razón por la que podrían haber decidido eso es que el doble buffer en realidad hace que la pintura sea más lenta. El paso adicional para renderizar el mapa de bits del buffer cuesta tiempo. Simplemente parece más rápido para el ojo humano, observa el mapa de bits que aparece de repente. No puede ver el tiempo que lleva dibujar en el mapa de bits. A menos que otros controles deban ser pintados y obtengan su turno después del DGV, entonces es bastante visible.

Lo que ves es que la forma se dibuja primero, con agujeros donde van los controles. Esos agujeros tienen un fondo blanco. Negro cuando usa la propiedad TransparencyKey u Opacity. Cada control recibe el evento Paint y los agujeros se llenan uno por uno. Ese efecto también se percibe como parpadeo por parte del usuario, aunque es un tipo diferente de parpadeo del que DoubleBuffered resuelve. Es especialmente notable cuando el fondo es negro.

Lo que se necesita para resolver este problema es que toda la forma, con todos sus controles, tiene doble amortiguación. Eso no está disponible en Windows Forms. Sin embargo, Windows XP y versiones posteriores realmente lo soportan. Verifique este hilo para ver cómo se hace eso. Tenga en cuenta que puede tener efectos secundarios según lo documentado en ese hilo.



Creo que es la mejor solución:

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

encontrado aquí