2009-02-25 16 views
5

Windows formum var. Üzerinde çeşitli datagridviews içerir. Bir noktada, kullanıcı datagridviews'ı güncelleyen bir düğmeye basabilir. Yaptıkları zaman, genellikle datagridview'in kendisini her seferinde bir satır yeniden çizerek oturup izleyebilirler. Ben SuspendLayout/ResumeLayout fonksiyonlarını gördüğümWindows Formunu Yeniden Dağıtmayı Askıya Al

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

kontrolü anlatmak için bir yol istiyorum, yani onun "bitti" kadar boya değil kontrol için istiyorum, ama yaptıkları hiçbir şey (sadece veri değerlerini düzeltmek değil, yeniden boyutlandırma/hareket kontrolleriyle ilgili gibi görünüyorlar)

+0

olası yinelenen olurdu WM_SETREDRAW Win32 mesajdır ve çocukları? (http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children) –

+0

Bkz. http://stackoverflow.com/ sorular/487661/how-do-i-askıya-boyama-a-contro için l-ve-çocukları – Simon

cevap

8

deneyebileceğiniz birkaç şey vardır. Bu, gerçek DataGridView örneğindeki özellik değil, Form. Korumalı bir özellik, bu yüzden onu ayarlamak için kılavuzunuzu alt sınıflara eklemeniz gerekecek. Ben küçük beraberlik güncellemeleri çok gördüm

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

bazı video kartlarında DataGridView ile bir süre alabilir ve bu onlar ekran için kapalı gönderilmeden önce onları harmanlanmasından aracılığıyla sorunu çözebilir.


deneyebileceğiniz başka şey [Nasıl bir denetim için boyama askıya yok

başka yerde kodunuzda
// ... 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); 
} 

size

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

Formu DoubleBuffer kullanacak şekilde ayarlamayı deneyebilirsiniz. Form.DoubleBuffer özelliğini true değerine ayarlayın ve bu, sorununuzu çözmelidir. ,

İlk true DataGridView'in DoubleBuffer özelliğini ayarlamayı deneyin:

+0

Yeniden çizmeyi biraz düzeltir, ancak yine de her bir kutunun içine çekildiğini görebilirsiniz. – GWLlosa

İlgili konular