SuspendLayout和BeginUpdate之间的区别

时间:2014-02-07 04:07:43

标签: .net winforms performance drawing controls

我没有找到关于两个方法Control.SuspendLayoutBeginUpdate之间潜在差异的实际解释(通常见于列表控件ListViewComboBoxListBox等),除此之外,它们都能提高绩效。

据我所知:

  1. 他们都暂停了绘图,直到所有要显示的项目都被加载,然后重新绘制。

  2. 当控件添加到SuspendLayoutPanel等容器控件时,
  3. 通常会调用GroupBox,而BeginUpdate用于添加非控制项目,例如ListBox用于列出ResumeLayout之类的控件的对象。

  4. 但是为什么他们这样做会有两个电话?或者他们有什么不同的做法?

    同样地,EndUpdate和{{1}}等价物。

2 个答案:

答案 0 :(得分:11)

他们没有任何共同之处。 SuspendLayout关闭自动布局,这是由TableLayoutPanel和FlowLayoutPanel等控件使用的类型,以及从Dock,Anchor和AutoSize属性获得的布局更新。它对ListView,ComboBox或ListBox完全没有影响,这些控件不执行布局。通常只有在批量添加控件到容器时才使用它。有时,当自动布局使窗口的大小变得太令人讨厌时,您会使用它。它确实减少了重绘的次数,完全是因为它暂停了控件大小的更新。

BeginUpdate停止控件重绘自身。当你批量添加项目时,你在ListView或ListBox等控件上使用它,并且出于某种原因不能使用它们的Items.AddRange()方法。

答案 1 :(得分:3)

正如您所指出的那样,BeginUpdate是列表控件的一部分,在您添加项目时使用。

SuspendLayout类似,但它来自Control类。当你进行自定义绘制时,这很有用。

所以真的,不同之处在于控件中的控件与绘图项之间的对比。如果设置与绘图相关的属性 - 请使用SuspendLayout。在添加项目的过程中,请使用BeginUpdate

<强>更新

机制有点不同。 BeginUpdate在项目添加/删除期间禁止绘制事件。如果您尝试调试paint事件,您可能会发现它发生了很多事情。

SuspendLayout会在移动,调整大小等过程中抑制布局计算。