Как удалить элементы управления из контейнера без обновления контейнера - PullRequest
5 голосов
/ 09 августа 2011

У меня есть обычный элемент управления Panel с кучей пользовательских элементов управления, содержащихся внутри.На данный момент я делаю следующее:

panel.Controls.Clear();

, но я вижу (хотя и быстро), что каждый элемент управления исчезает по отдельности.

Использование SuspendLayout и ResumeLayout не имеет заметного эффекта.

Вопрос: Есть ли способ удалить все элементы управления и обновлять контейнер только тогда, когда все дочерние элементы управления имеютбыли удалены?

Редактировать: удаляемые мной элементы управления получены из UserControl, поэтому у меня есть некоторый контроль над их поведением при рисовании.Есть ли какая-нибудь функция, которую я мог бы переопределить, чтобы предотвратить обновление по мере их удаления?

Ответы [ 2 ]

5 голосов
/ 09 августа 2011

Спасибо, Ганс, за ваше предложение - да, оказывается, у меня был утечка контроля.

Вот что я в итоге сделал:

 panel.Visible = false;

 while (panel.Controls.Count > 0)
 {
    panel.Controls[0].Dispose();
 }

 panel.Visible = true;

По сути, я скрываю всю панель (которая не имеет границ) перед тем, как распоряжаться каждым элементом управления. Удаление каждого элемента управления автоматически удаляет указанный элемент управления из родительского контейнера, что приятно. Наконец, я снова делаю контейнер видимым.

0 голосов
/ 09 августа 2011

Мне кажется, что вам нужен двойной буфер.

Есть несколько ответов по этому поводу, например,

Двойная буферизация Winforms , Включение двойной буферизации

и

Как включить двойную буферизацию элемента управления с помощью C # (формы Windows)?

SuspendLayout останавливает перерисовку элемента управления при удалении дочерних элементов, но эти действия по-прежнему обрабатываются по порядку при вызове ResumeLayout. Двойная буферизация вообще остановит рисование элемента управления, пока не будет обновлен закадровый буфер. Обновление не произойдет быстрее, но оно будет отображаться на экране сразу из буфера. Если ваша машина работает очень медленно, вы можете по-прежнему мерцать при отображении буфера на экран, как при загрузке изображения.

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