您可以尝试以下几件事:
首先,尝试将 DataGridView 的 DoubleBuffer 属性设置为 true。这是实际 DataGridView 实例上的属性,而不是 Form。它是一个受保护的属性,因此您必须对网格进行子类化才能设置它。
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}
我已经看到一些视频卡上的 DataGridView 进行了很多小的绘制更新需要一段时间,这可以通过在发送显示之前将它们分批处理来解决您的问题。
您可以尝试的另一件事是 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);
}
在你的代码的其他地方你有
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...
}