Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在WinForm中隐藏控件要比使控件可见花费更长的时间?_C#_Winforms_Performance - Fatal编程技术网

C# 为什么在WinForm中隐藏控件要比使控件可见花费更长的时间?

C# 为什么在WinForm中隐藏控件要比使控件可见花费更长的时间?,c#,winforms,performance,C#,Winforms,Performance,我有一个包含56个复选框的FlowLayoutPanel。复选框用于三状态模式。现在是有趣的部分。如果复选框未勾选,则表示它们未被使用,可以隐藏以方便阅读。要隐藏它们,我使用另一个复选框。当用户单击复选框时,FlowPanel中所有未使用的复选框都将使用foreach迭代隐藏 问题是要隐藏它们,foreach调用(checkBox.Visible=false)大约需要2-3秒,而显示它们(checkBox.Visible=true)则需要0.5秒 关于为什么会发生这种情况,有什么建议吗 priv

我有一个包含56个复选框的
FlowLayoutPanel
。复选框用于三状态模式。现在是有趣的部分。如果复选框未勾选,则表示它们未被使用,可以隐藏以方便阅读。要隐藏它们,我使用另一个复选框。当用户单击复选框时,FlowPanel中所有未使用的复选框都将使用foreach迭代隐藏

问题是要隐藏它们,foreach调用(
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;
   }
}

如果你隐藏了什么东西,系统必须找出该物体下面的东西,并强迫该物体重新绘制自身


另一方面,当使控件可见时,必须仅绘制该控件

您可以在隐藏所有复选框之前尝试调用
SuspendLayout
,然后调用
ResumeLayout
。更多信息,请参阅

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

- 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,layouter算法在您调用ResumeLayout之前根本不会运行,将数字从1275减少到1。

只是一个“元建议”:获取您选择的性能分析器(例如)并测量需要多长时间。我知道隐藏它们比显示它们需要更长的时间。您是否尝试过在
flowLayoutPanel
上调用和
ResumeLayout
?@RobertIagar是的,这就是您在问题标题中已经说明的。我的建议是帮助你找出“为什么”。@Damien_是一个不信上帝的人,但这并不是问题的答案。这意味着如果我倒转(从底层乞讨),情况会有所改善吗?不确定。。。最好先试试MattDavey提出的
SuspendLayout
-
ResumeLayout
方法。这就回答了问题。修复方法是
SuspendLayout
-
ResumeLayout
方法。这不是问题的原因,原因是布局算法运行了数百次-这就是SuspendLayout修复问题的原因。如果重新绘制是导致SuspendLayout没有任何区别(SuspendLayout不会阻止控件重新绘制)。请看,我将此作为一条评论发布,因为它实际上并没有回答所提出的问题…@Damien_the_Noisever是的,很抱歉没有更早看到这一点。我重新选择了这个问题的答案。谢谢你的帮助。@RobertIagar我已经修改了答案,解释了为什么它运行缓慢。