.net - studio - datagridview c# ejemplos
¿Cómo mejorar el rendimiento de pintura de DataGridView? (6)
(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 recopilar 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.
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 memoria para su escenario. Más detalles puedes visitar dapfor. com
La solución limpia sin reflexión es:
//http://.com/questions/4255148/how-to-improve-painting-performance-of-datagridview
public class DataGridViewDoubleBuffered : DataGridView
{
public DataGridViewDoubleBuffered()
{
DoubleBuffered = true;
}
}
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 });
¿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