Есть несколько вещей, которые вы можете попробовать:
Сначала попробуйте установить для свойства DoubleBuffer объекта DataGridView значение true. Это свойство фактического экземпляра DataGridView, а не формы. Это защищенное свойство, поэтому для его установки вам нужно будет создать подкласс для вашей сетки.
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...
}