propiedades - manipular datagridview c#
Parpadeo durante las actualizaciones de controles en WinForms(por ejemplo, DataGridView) (8)
En mi aplicación, tengo un control DataGridView que muestra datos para el objeto seleccionado. Cuando selecciono un objeto diferente (en un cuadro combinado de arriba), necesito actualizar la grilla. Lamentablemente, los diferentes objetos tienen datos completamente diferentes, incluso columnas diferentes, por lo que necesito borrar todos los datos y columnas existentes, crear nuevas columnas y agregar todas las filas. Cuando se hace esto, todo el control parpadea horriblemente y lleva siglos. ¿Existe una forma genérica de obtener el control en estado de actualización para que no se vuelva a pintar y luego volver a pintar después de que termine todas las actualizaciones?
Sin duda es posible con TreeViews:
myTreeView.BeginUpdate();
try
{
//do the updates
}
finally
{
myTreeView.EndUpdate();
}
¿Hay una manera genérica de hacer esto con otros controles, DataGridView en particular?
ACTUALIZACIÓN: Lo siento, no estoy seguro de haber sido lo suficientemente claro. Veo el "parpadeo", porque después de la edición única, el control se vuelve a pintar en la pantalla, por lo que puede ver cómo se encoge la barra de desplazamiento, etc.
Desafortunadamente, creo que Thins podría ser un subproducto del framework .net. Estoy experimentando un parpadeo similar aunque con controles personalizados. Muchos de los materiales de referencia que he leído indican esto, junto con el hecho de que el método del doble buffer no eliminó ningún parpadeo.
Parece que quieres doble buffering:
http://www.codeproject.com/KB/graphics/DoubleBuffering.aspx
Aunque esto se usa principalmente para controles individuales, puede implementar esto en su formulario o control de Windows Forms.
Esto funcionó para mí.
http://www.syncfusion.com/faq/windowsforms/search/558.aspx
Básicamente implica derivar del control deseado y establecer los siguientes estilos.
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
El control .NET admite los métodos SuspendLayout y ResumeLayout . Elija el control principal apropiado (es decir, el control que aloja los controles que desea rellenar) y haga algo como lo siguiente:
this.SuspendLayout();
// Do something interesting.
this.ResumeLayout();
El doble almacenamiento en memoria intermedia no ayudará aquí dado que solo funciona con doble amortiguación de pintura, el parpadeo que el OP está viendo es el resultado de múltiples operaciones de pintura:
- Borrar contenido de control -> volver a pintar
- Borrar columnas -> volver a pintar
- Rellenar nuevas columnas -> volver a pintar
- Agregar filas -> volver a pintar
entonces hay cuatro repintados para actualizar el control, de ahí el parpadeo. Desafortunadamente, no todos los controles estándar tienen el BeginUpdate / EndUpdate que eliminaría todas las llamadas a repintar hasta que se llame a EndUpdate. Esto es lo que puedes hacer:
- Tener un control diferente para cada conjunto de datos y Mostrar / Ocultar los controles,
- Quite el control de su principal, actualice y luego agregue el control nuevamente
- Escribe tu propio control.
Las opciones 1 y 2 aún parpadearían un poco.
En el programa .NET GUI en el que estoy trabajando, creé un conjunto de controles personalizados que eliminaban todo el parpadeo.
En lugar de agregar las filas de la cuadrícula de datos de a una por vez, use el método DataGridView.Rows.AddRange
para agregar todas las filas a la vez. Eso solo debería actualizar la pantalla una vez. También hay un DataGridView.Columns.AddRange
para hacer lo mismo para las columnas.
La gente parece olvidar una solución simple para esto:
Object.Visible = false;
//do update work
Object.Visible = true;
Sé que parece extraño, pero eso funciona. Cuando el objeto no es visible, no se volverá a dibujar. Sin embargo, todavía necesita hacer la actualización de begin
y end
.
También puedes probar esto, su trabajo.
public static void DoubleBuffered(this DataGridView datagridview, bool setting)
{
Type DgvType = datagridview.GetType();
PropertyInfo pi = DgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(datagridview, setting, null);
}