5

我有一个窗体。它包含几个数据网格视图。在某些时候,用户可以按下更新数据网格视图的按钮。当他们这样做时,他们通常可以坐下来观看 datagridview 自己重绘,一次一行。我希望控件在“完成”之前不绘制,也就是说,我想要一种方法来告诉控件

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

我见过 SuspendLayout / ResumeLayout 函数,但它们什么都不做(它们似乎与调整大小/移动控件更相关,而不仅仅是编辑它们的数据值?)

4

2 回答 2

10

您可以尝试以下几件事:

首先,尝试将 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...
}
于 2009-02-25T21:07:46.083 回答
0

您可以尝试将表单设置为使用 DoubleBuffer。将 Form.DoubleBuffer 属性设置为 true,这应该可以解决您的问题。

于 2009-02-25T19:55:03.793 回答