我有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;
}
}
答案 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。