Приостановить перерисовку формы Windows - PullRequest
5 голосов
/ 25 февраля 2009

У меня есть форма окна. Он содержит несколько обзоров данных на нем. В какой-то момент пользователь может нажать кнопку, которая обновляет представления данных. Когда они это делают, они обычно могут сидеть и смотреть, как перерисовывается сетка данных, по одной строке за раз. Я бы хотел, чтобы элемент управления не рисовал до тех пор, пока он не будет «готов», то есть я бы хотел, чтобы элемент управления сообщал

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

Я видел функции SuspendLayout / ResumeLayout, но они ничего не делают (похоже, они больше связаны с изменением размера / перемещением элементов управления, а не просто с редактированием их значений данных)

Ответы [ 2 ]

9 голосов
/ 26 февраля 2009

Есть несколько вещей, которые вы можете попробовать:

Сначала попробуйте установить для свойства 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...
}
0 голосов
/ 25 февраля 2009

Вы можете попытаться настроить форму для использования DoubleBuffer. Установите для свойства Form.DoubleBuffer значение true, и это должно решить вашу проблему.

...