2009-02-25 7 views
5

ich ein Fenster Form haben. Es enthält mehrere Datagridviews darauf. Irgendwann kann der Benutzer eine Taste drücken, die die Datagrid-Ansichten aktualisiert. Wenn sie es tun, können sie in der Regel sitzen und die Datagridview selbst neu zu zeichnen, eine Zeile zu einem Zeitpunkt. Ich möchte für das Steuerelement erst seine „done“ zu malen, das heißt, ich einen Weg möchte die KontrolleSuspend Redraw von Windows Form

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

Ich habe die SuspendLayout/ResumeLayout Funktionen gesehen zu sagen, aber sie tun nichts (sie scheinen mehr im Zusammenhang mit Größe ändern/Verschieben von Kontrollen zu sein, nicht nur ihre Datenwerte editting?)

+0

möglich Duplikat haben würde [Wie kann ich Malerei für eine Kontrolle aussetzen und seine Kinder?] (http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children) –

+0

Siehe http://stackoverflow.com/ Fragen/487661/how-do-i-Suspendieren-Malen-für-eine-Kontrolle l-und-its-Kinder – Simon

Antwort

8

Es gibt ein paar Dinge, die Sie ausprobieren können:

Zuerst versuchen, die Double Eigenschaft des Datagridview auf true setzen. Dies ist die Eigenschaft der tatsächlichen DataGridView-Instanz, nicht das Formular. Es handelt sich um eine geschützte Eigenschaft. Sie müssen also Ihr Gitter unterteilen, um es festzulegen.

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

ich viele kleine Unentschieden Updates gesehen habe eine Weile dauern, mit dem Datagridview auf einigen Grafikkarten, und dies kann Ihr Problem lösen, indem sie Dosieren, bevor sie für die Anzeige des Feldes verwiesen werden.


Eine andere Sache, die Sie versuchen können, ist die Win32 Nachricht 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); 
} 

An anderer Stelle in Ihrem Code Sie

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

Sie können versuchen, das Formular zu setzen Double zu verwenden. Stellen Sie die Form.DoubleBuffer Eigenschaft auf true, und dies sollte Ihr Problem lösen.

+0

Es ist die neu zeichnen glättet ein wenig, aber man kann immer noch jede Box Einziehen sehen. – GWLlosa