2009-02-25 24 views
5

Tengo un formulario de Windows. Contiene varias datagridviews en él. En algún momento, el usuario puede presionar un botón que actualiza la datagridviews. Cuando lo hacen, generalmente se pueden sentar y ver la vista de cuadrícula de datos redibujarse, una fila a la vez. Me gustaría que el control no pintar hasta su "hecho", es decir, me gustaría una manera de decir que el controlSuspender Volver a dibujar de Windows Formulario

Control.SuspendRedraw() 
this.doStuff() 
this.doOtherStuff() 
this.doSomeReallyCoolStuff() 
Control.ResumeRedaw() 

que he visto las funciones SuspendLayout/ResumeLayout, pero lo hacen nada (parecen estar más relacionados con los controles de cambio de tamaño/movimiento, no solo editando sus valores de datos?)

+0

posible duplicado de [¿Cómo suspendo la pintura para un control y sus hijos?] (http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children) –

+0

Ver http://stackoverflow.com/ preguntas/487661/cómo-hacer-i-suspender-pintar-para-un-contro l-and-its-children – Simon

Respuesta

8

Hay un par de cosas que usted puede intentar:

En primer lugar, tratar de establecer la propiedad DoubleBuffer del DataGridView en true. Esta es la propiedad en la instancia de DataGridView real, no en el Formulario. Es una propiedad protegida, por lo que tendrás que subclasificar tu cuadrícula para configurarla.

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

que he visto un montón de cambios de sorteo pequeños toman un tiempo con el DataGridView en algunas tarjetas de vídeo, y esto puede resolver su problema mediante procesamiento por lotes para arriba antes de que sean enviados para su visualización.


Otra cosa que puede probar es el mensaje de Win32 WM_SETREDRAW

// ... this would be defined in some reasonable location ... 

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
static extern IntPtr SendMessage(HandleRef hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam); 

static void EnableRepaint(HandleRef handle, bool enable) 
{ 
    const int WM_SETREDRAW = 0x000B; 
    SendMessage(handle, WM_SETREDRAW, new IntPtr(enable ? 1 : 0), IntPtr.Zero); 
} 

En otras partes de su código que tendría

HandleRef gh = new HandleRef(this.Grid, this.Grid.Handle); 
EnableRepaint(gh, false); 
try 
{ 
    this.doStuff(); 
    this.doOtherStuff(); 
    this.doSomeReallyCoolStuff(); 
} 
finally 
{ 
    EnableRepaint(gh, true); 
    this.Grid.Invalidate(); // we need at least one repaint to happen... 
} 
0

Puede intentar configurar el formulario para usar DoubleBuffer. Establezca la propiedad Form.DoubleBuffer en true, y esto debería resolver su problema.

+0

Suaviza un poco el redibujado, pero aún puede ver cada cuadro dibujado. – GWLlosa

Cuestiones relacionadas