2009-02-25 35 views
5

Tôi có biểu mẫu cửa sổ. Nó chứa một số datagridviews trên đó. Tại một số thời điểm, người dùng có thể nhấn một nút để cập nhật các thông tin tóm tắt dữ liệu. Khi họ làm, họ thường có thể ngồi và xem datagridview vẽ lại chính nó, một hàng tại một thời điểm. Tôi muốn cho sự kiểm soát để không vẽ cho đến khi nó "thực hiện", có nghĩa là, tôi muốn một cách để nói điều khiển đểTạm dừng vẽ lại Biểu mẫu Windows

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

Tôi đã nhìn thấy các chức năng SuspendLayout/ResumeLayout, nhưng họ làm không có gì (chúng dường như có liên quan nhiều hơn đến việc điều chỉnh kích thước/di chuyển, không chỉ chỉnh sửa datavalues ​​của chúng?)

+0

trùng lặp có thể xảy ra [Làm thế nào để đình chỉ vẽ cho một điều khiển và con cái của nó?] (http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children) –

+0

Xem http://stackoverflow.com/ question/487661/how-do-i-suspend-tranh-cho-một-contro l-and-its-children – Simon

Trả lời

8

Có một vài điều mà bạn có thể thử:

tiên, hãy thử thiết lập thuộc tính của DataGridView DoubleBuffer là true. Đây là thuộc tính trên thực tế DataGridView instance, không phải là Form. Đó là một thuộc tính được bảo vệ, vì vậy bạn sẽ phải phân lớp mạng của mình để đặt nó.

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

Tôi đã nhìn thấy rất nhiều thông tin cập nhật hòa nhỏ mất một thời gian với DataGridView trên một số card màn hình, và điều này có thể giải quyết vấn đề của bạn bằng cách Trạm trộn chúng lên trước khi chúng được gửi đi để hiển thị.


Một điều bạn có thể thử là sứ điệp 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); 
} 

Ở những nơi khác trong mã của bạn, bạn sẽ phải

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

Bạn có thể thử đặt biểu mẫu để sử dụng DoubleBuffer. Đặt thuộc tính Form.DoubleBuffer thành true và điều này sẽ giải quyết vấn đề của bạn.

+0

Nó làm mịn vẽ lại một chút, nhưng bạn vẫn có thể thấy từng ô được vẽ. – GWLlosa

Các vấn đề liên quan