我没有找到关于两个方法Control.SuspendLayout
和BeginUpdate
之间潜在差异的实际解释(通常见于列表控件ListView
,ComboBox
,ListBox
等),除此之外,它们都能提高绩效。
据我所知:
他们都暂停了绘图,直到所有要显示的项目都被加载,然后重新绘制。
SuspendLayout
,Panel
等容器控件时,通常会调用GroupBox
,而BeginUpdate
用于添加非控制项目,例如ListBox
用于列出ResumeLayout
之类的控件的对象。
但是为什么他们这样做会有两个电话?或者他们有什么不同的做法?
同样地,EndUpdate
和{{1}}等价物。
答案 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
会在移动,调整大小等过程中抑制布局计算。