我有一个Windows窗体。它包含几个datagridviews。在某些时候,用户可以按下更新datagridviews的按钮。当他们这样做时,他们通常可以坐下来观看datagridview重绘本身,一次一行。我希望控件在它“完成”之前不要画画,也就是说,我想要一种告诉控件的方法
Control.SuspendRedraw()
this.doStuff()
this.doOtherStuff()
this.doSomeReallyCoolStuff()
Control.ResumeRedaw()
我已经看过SuspendLayout / ResumeLayout函数,但它们什么都不做(它们似乎与调整大小/移动控件更相关,而不仅仅是编辑它们的数据值?)
答案 0 :(得分:9)
您可以尝试以下几种方法:
首先,尝试将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...
}
答案 1 :(得分:0)
您可以尝试将表单设置为使用DoubleBuffer。 将Form.DoubleBuffer属性设置为true,这应该可以解决您的问题。