2012-10-29 400 views
9

我需要添加很多控件到父控件。为什么添加SuspendLayout和ResumeLayout会降低性能?

但我发现,如果我之前添加ParentControl.SuspendLayoutParentControl.ResumeLayout后,我添加这些控件到父,我用秒表来测量刻度: 如果我删除代码ParentControl.SuspendLayoutParentControl.ResumeLayout,它会更快。为什么会发生?因此SuspendLayoutResumeLayout不应该减少添加子控件的时间,对吧?那么使用SuspendLayoutResumeLayout或换句话说,如果我不使用SuspendLayoutResumeLayout,但直接将子控件添加到父母,有什么不好?

+0

您添加了多少个控件?如果仅仅是几个,那么就没有必要,但是如果你增加了数百/数千,你就更有可能看到差异。另外,如果你计算了两次的差别,它只是一小部分(足够在执行时间内随机变化)还是真的很重要? – Servy

+0

您使用哪种类型的控件?类似的问题在[这里]描述(http://www.clubfarpoint.com/Forums/forums/thread/32939.aspx)。 – Neolisk

+0

是的,我添加了数百个控件。 – spspli

回答

8

这是由于通常的原因,删除代码通常会使您的程序运行得更快。

Suspend/ResumeLayout()被普遍误解。只有具有非默认AutoSize,Dock或Anchor属性的控件时,它才会有影响。当控件的布局属性互相影响时,它可以防止布局事故。

如果您的表格有数百个的控件,那么您根本不可能使用这些属性。这样一个巨大的窗口不容易自动布局。所以你调用的方法实际上并没有做任何事情,他们需要时间来迭代布局,但没有任何好处。

12

您可能希望使用.ResumeLayout(false)来代替。调用mySubPanel.ResumeLayout()等于.ResumeLayout(true),这意味着它应该立即重新布置此控件(以及未在该点暂停的所有子控件)。

MSDN quote:“调用ResumeLayout方法[不带参数]强制立即布局,如果有任何挂起的布局请求。” [1]

如果你喜欢添加100个控制面板,你想用这样的方法:)

  1. mainPanel.SuspendLayout(
  2. 创建子控制
  3. 呼儿。 SuspendLayout()
  4. 变化的子控件的属性
  5. 添加子控件mainPanel中
  6. 呼叫child.ResumeLayout(假) - 这意味着:下一个布局运行,重新布局这个控件,但不是立即
  7. 为每个子控件重复(2-6)
  8. 调用mainPanel.ResumeLayout(true) - 这意味着:重新布局我的mainPanel和每个子控件现在!

注意:如果没有SuspendLayout(),控件的每个属性更改都会调用布局例程 - 即使更改.BackColor也会使您的控件重新布局自身。

[1] http://msdn.microsoft.com/en-us/library/y53zat12.aspx

+1

这有助于在我们遍历(循环)很多控件进行属性更改时尤其如此。对循环情况有很大的影响。谢谢! – rajkumaradass

相关问题