为什么在WinForm中隐藏控件比使它们可见更长?

时间:2012-09-12 09:03:06

标签: c# winforms performance

我有FlowLayoutPanel,其中包含56个复选框。复选框用于三种状态模式。现在这是有趣的部分。如果取消选中复选框,则意味着它们未被使用,并且可以隐藏以便于阅读。要隐藏它们,我使用另一个复选框。当用户单击该复选框时,使用foreach迭代隐藏FlowPanel中所有未使用的复选框。

问题在于隐藏它们,foreach call(checkBox.Visible=false)约2-3秒并显示它们(checkBox.Visible=true)需要0.5秒。

有关为何发生这种情况的任何建议?

private void hideUnusedPinsCheckBoxClick(objest sender, EventArgs e)
{
   bool state = !hideUnusedPinsCheckBox.Checked;
   foreach(object obj in flowLayoutPanel.Controls)
   {
      CheckBox cB = (CheckBox)obj;
      if(cB.CheckState == CheckState.Unchecked)
         cB.Visible=state;
   }
}

2 个答案:

答案 0 :(得分:3)

如果隐藏某些内容,系统必须找出该对象下方的内容,并强制该内容重绘。

另一方面,当您使控件可见时,只能绘制该控件。

答案 1 :(得分:3)

您可以尝试在隐藏所有复选框之前调用SuspendLayout,然后再调用ResumeLayout。有关详情,请参阅this link

回答你关于为什么这种情况发生的问题。每次在FlowLayoutPanel上隐藏(或显示)控件时,都会执行面板布局算法,以便重新排列屏幕上的所有内容。如果您连续隐藏50个复选框,则layouter算法将至少执行1,275次。例如:

- Hide checkbox
- Perform layout for remaining 49 check boxes
- Hide checkbox
- Perform layout for remaining 48 check boxes
- Hide checkbox
- Perform layout for remaining 47 check boxes
- etc...

通过调用SuspendLayout,在您调用ResumeLayout之前,layouter算法根本不会运行,将数字从1,275减少到1。