¿Cómo mejorar el rendimiento de pintura de DataGridView?

(perdón por mal inglés)

Tengo un gran problema con el rendimiento de DataGridView cuando vuelve a pintar.

Estoy usando DataGridView para mostrar los registros de una secuencia de aplicación externa. Los mensajes de la transmisión entran con una frecuencia alta (menos de 1 ms). Si agrego una nueva fila a DataGridView inmediatamente cuando aparece cada nuevo mensaje, DataGridView no tiene tiempo para volver a pintarse antes de que llegue el siguiente mensaje.

Una posible solución es usar una cola para recostackr mensajes y volver a pintar DataGridView cada 100 ms con los mensajes de la cola. Esto es bueno, pero DataGridView parpadea cuando se desplaza automáticamente a la última fila. (El desplazamiento suave está desactivado)

¿Me puede ayudar a mejorar el rendimiento de DataGridView ?

Recientemente tuve algunos problemas de lentitud con DataGridView y la solución fue el siguiente código

 public static void DoubleBuffered(this DataGridView dgv, bool setting) { Type dgvType = dgv.GetType(); PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic); pi.SetValue(dgv, setting, null); } 

Activa el doble almacenamiento en búfer para objetos DataGridView . Simplemente llame a DoubleBuffered() en su DGV. Espero eso ayude.

Editar: Podría haberlo sacado TAN, pero no puedo buscar el original ahora, así que esto es solo para enfatizar que el código no es mío.

¿Ha habilitado el doble buffering para la vista de cuadrícula?

eche un vistazo al horrible rendimiento de redibujado del DataGridView en una de mis dos pantallas

si aún no has tenido algunas ideas

La solución limpia sin reflexión es:

 public class DataGridViewDoubleBuffered : DataGridView { public DataGridViewDoubleBuffered() { DoubleBuffered = true; } } 

A continuación, vaya a myForm.designer.cs y cambie un tipo de DataGridView a DataGridViewDoubleBuffered.

Lea también el artículo de MSDN: Mejores prácticas para escalar el control DataGridView de Windows Forms

Al trabajar con grandes cantidades de datos, el control DataGridView puede consumir una gran cantidad de memoria en la parte superior, a menos que lo use con cuidado. En clientes con memoria limitada, puede evitar algunos de estos gastos indirectos al evitar las funciones que tienen un alto costo de memoria.

También puede administrar algunas o todas las tareas de mantenimiento y recuperación de datos usando el modo virtual para personalizar el uso de la memoria para su escenario. Más detalles puedes visitar dapfor. com

utilizo esta solución y vi un poco fijo.

Se usa reflexión, así que importe esto también en el código

 using System.Reflection; typeof(DataGridView).InvokeMember("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty, null,this.dataGridView1,new object[] { true });