2014-02-07 3 views
5

не найти хорошее объяснение о том, что на самом деле основное различие между этими двумя методами Control.SuspendLayout и BeginUpdate (обычно наблюдаемым на контрольных списков, как ListView, ComboBox, ListBox и т.д.), кроме того, что они оба улучшить представление.разница между SuspendLayout и BeginUpdate

Из того, что я понимаю:

  1. они оба приостановить рисунок, пока все элементы для отображения загружены, и перекрашивать после этого.

  2. обычно SuspendLayout вызывается, когда элементы управления добавляются к элементам управления контейнеров, как Panel, GroupBox и т.д., в то время как BeginUpdate используется для добавления элементов управления, не как объекты для отображения элементов управления, как ListBox.

Но почему существуют два звонка, когда они делают то же самое? Или что они делают по-другому?

Аналогичным образом существует ResumeLayout и EndUpdate эквивалентов.

ответ

8

Они не имеют ничего общего. SuspendLayout отключает автоматический макет, который используется элементами управления, такими как TableLayoutPanel и FlowLayoutPanel, а также обновлениями макета, которые вы получаете от свойств Dock, Anchor и AutoSize. Это не влияет на ListView, ComboBox или ListBox, эти элементы управления не выполняют макет. Обычно вы используете его только при добавлении элементов управления в контейнер. Иногда вы используете его, когда автоматическая компоновка делает изменение размера окна слишком неприятным. Он уменьшает количество рецензентов только благодаря тому, что он приостанавливает обновление размера контроля.

BeginUpdate останавливает управление, перекрашивая себя. Вы используете do, используя элементы управления ListView или ListBox, когда вы добавляете в них элементы, и по какой-то причине не можете использовать метод Items.AddRange().

+0

Хммм, так что возникает вопрос, почему существует 'SuspendLayout' на элементах управления без контейнера, таких как списки и кнопки, которые не выполняют операцию макета. Я думаю, что это виртуальный метод, который не переопределяется или не реализуется в дочерних классах, таких как ListBox, и ничего не делает. – nawfal

3

Как вы указали, BeginUpdate является частью элементов управления списком и используется при добавлении элементов.

SuspendLayout подобен, но он исходит из Control класса. Это полезно, когда вы делаете пользовательские ничьи.

Так что разница заключается в управлении чертежами и чертеже элементов управления. Если вы установите свойства, связанные с рисованием, используйте SuspendLayout. В процессе добавления элементов, используйте BeginUpdate

Обновление

механики немного разные. BeginUpdate подавляет события рисования во время добавления/удаления элемента. Если вы когда-нибудь попытаетесь отладить событие paint, вы, вероятно, увидите, что он много горит.

SuspendLayout подавляет вычисление макета во время перемещения, изменения размеров и т.д.

+0

Да, я так понимаю. Мой вопрос заключается в том, почему должна быть разница между созданием нового элемента управления и обновлением макета существующего элемента управления. – nawfal

+0

@nawfal См. Обновление –

Смежные вопросы