Отложить обновления формы - PullRequest
1 голос
/ 02 февраля 2010

Есть ли способ отложить форму от обновления / перекрашивания при манипулировании элементами управления?

Я использую элемент управления TableLayoutPanel в своей форме и хочу динамически удалять / добавлять разные пользовательские элементы управления в разные ячейки таблицы.

Когда я это делаю, обновление экрана происходит слишком медленно, и происходит какое-то мигание.

tablelayout.SuspendLayout()

SuspendLayout(), кажется, не имеет никакого эффекта.

Ответы [ 4 ]

1 голос
/ 09 февраля 2010

Я полностью избавился от мерцания, создав класс, который унаследовал таблицу, а затем включил двойной буфер.

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace myNameSpace.Forms.UserControls
{
    public class TableLayoutPanelNoFlicker : TableLayoutPanel
    {
        public TableLayoutPanelNoFlicker()
        {
            this.DoubleBuffered = true;
        }
    }
}
1 голос
/ 03 февраля 2010

Попробуйте:

try {
    SuspendLayout();

    // manipulate your controls

} finally {
    ResumeLayout();
}
1 голос
/ 03 февраля 2010

зависит от контроля;найдите BeginUpdate / EndUpdate или BeginEdit / EndEdit и т. д. (и используйте их в блоке try / finally).Однако обратите внимание, что только некоторые элементы управления имеют эти методы, и они не привязаны к удобному интерфейсу, так что это немного вручную.Например:

    listView.BeginUpdate();
    try
    {
        for (int i = 0; i < 100; i++)
        {
            listView.Items.Add("Item " + i);
        }
    }
    finally
    {
        listView.EndUpdate();
    }

Обратите внимание, что элементы управления, связанные с данными, могут иметь другие механизмы для отключения изменений, связанных с данными;например, BindingList<T> имеет настраиваемый параметр RaiseListChangedEvents, который отключает уведомления об изменениях во время редактирования данных.Вы также можете посмотреть на такие вещи, как «виртуальный режим».

0 голосов
/ 03 февраля 2010

Вы можете попробовать SuspendLayout / ResumeLayout - это то, как это делает код, сгенерированный конструктором форм, - загляните внутрь метода InitializeComponents в коде позади формы, чтобы понять, что я имею в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...