3

我有一个FlowLayoutPanel包含 56 个复选框。复选框用于三态模式。现在这是有趣的部分。如果复选框未选中,则表示它们未使用并且可以隐藏以便于阅读或阅读。为了隐藏它们,我使用了另一个复选框。当用户单击复选框时,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;
   }
}
4

2 回答 2

3

如果你隐藏了一些东西,系统必须找出那个对象下面的东西,并强制那个东西重新绘制自己。

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

于 2012-09-12T09:10:27.420 回答
3

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

回答您关于为什么会发生这种情况的问题。每次在 FlowLayoutPanel 上隐藏(或显示)控件时,都会执行面板布局器算法以重新排列屏幕上的所有内容。例如,如果您连续隐藏 50 个复选框,则布局器算法将至少执行 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,layouter 算法在调用 ResumeLayout 之前根本不会运行,将数量从 1,275 减少到 1。

于 2012-09-12T09:15:17.667 回答