2009-02-25 19 views
5

Ho un modulo di Windows. Contiene parecchie immagini di dati su di esso. Ad un certo punto, l'utente può premere un pulsante che aggiorna le viste dei dati. Quando lo fanno, di solito possono sedersi e guardare il datagridview ridisegnarsi, una riga alla volta. Mi piacerebbe per il controllo di non dipingere fino alla sua "fatto", vale a dire, mi piacerebbe un modo per dire al controllo perSospendi ridisegno di Windows Form

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

Ho visto le funzioni SuspendLayout/ResumeLayout, ma lo fanno niente (sembrano essere più correlati al ridimensionamento/spostamento dei controlli, non solo a modificare i loro valori dati?)

+0

possibile duplicato di [Come faccio sospendo la pittura per un controllo e i suoi figli?] (http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children) –

+0

Vedere http://stackoverflow.com/ domande/487.661/how-do-i-sospendono-pittura-per-un-contro l-and-its-children – Simon

risposta

8

ci sono un paio di cose che si possono provare:

In primo luogo, provare a impostare la proprietà DoubleBuffer del DataGridView su true. Questa è la proprietà sull'istanza DataGridView effettiva, non sul modulo. È una proprietà protetta, quindi dovrai sottoclasse la griglia per impostarla.

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

Ho visto un sacco di aggiornamenti piccoli sorteggio prendere un po 'con la DataGridView su alcune schede video, e questo può risolvere il problema da loro il dosaggio fino prima di essere espulso per la visualizzazione.


Un'altra cosa che si può provare è il messaggio 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); 
} 

Altrove nel codice si avrebbe

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

Puoi provare a impostare il modulo per utilizzare DoubleBuffer. Impostare la proprietà Form.DoubleBuffer su true e questo dovrebbe risolvere il problema.

+0

Riduce leggermente il ridisegno, ma è ancora possibile vedere ogni casella che viene disegnata. – GWLlosa