将~280控件从visible = true更改为visible = false大约需要8-9秒(太长时间)

时间:2014-11-25 07:13:27

标签: c# .net winforms

我想知道我是否可以做些什么来加快这个速度,我缩短了下面这部分代码的时滞。我想知道是否还有其他事情可以让它至少快2-3倍。

form1.SuspendLayout();
foreach (KeyValuePair<Control, bool> i in ItemControlUpdates)
{
    i.Key.Visible = i.Value;
}
form1.ResumeLayout();

编辑: 谢谢你们的评论,我纠正了我的代码并希望它表明我的具体问题。 (我不需要写文件)

EDIT2: 280控件是用户控件,我的应用程序要求在进行排序选择时查看所有这些控件或其中一些。

EDIT3: 答案是:必须在父级上调用SuspendLayout()才能生效,当我需要在控件所在的面板上使用它时,我在表单上错误地使用了它。

2 个答案:

答案 0 :(得分:3)

The fact is(正如this comment above中所述)操纵如此多的(280)控件必然会很慢,因为Windows Forms不是超快的。由于您还没有详细说明表单的结构和布局,我只能给您一些通用的建议:

  • 如果您正在操作的某些控件实际上未嵌入form1,则form1.SuspendLayout()对这些控件无效。暂停所有相关表格的布局。

  • 您可以尝试将逻辑上属于一起的一些控件分组到一个用户控件中,或者至少分组到Panel;然后,您只能使该容器控件可见或不可见。特别是当您使用AutoSize等布局功能时,这可能意味着Windows窗体必须进行更少的布局计算。

  • 大幅减少表单上的控件总数。很可能是因为有这么多控件,你的表单从用户体验(UX)的角度来看太复杂了:你一次向用户提出太多要求,而你的表单可能最终会让人感到困惑甚至无法使用。考虑重新设计表单。如果工作流真的那么复杂,你至少可以把它分成一系列简单的步骤 - 想想向导/多步对话。

答案 1 :(得分:3)

问题在于控件嵌入到面板中并与panel.SuspendLayout()交换form1.SuspendLayout()使得此操作完全没有时间。有几个人暗示这一点,我建议人们查看stakx答案,因为它包含其他/类似可能的解决方案,以解决与此类似的问题。

以下是可行的固定代码:

                cPanel.SuspendLayout();
                foreach (KeyValuePair<Control, bool> i in ItemControlUpdates)
                {
                    i.Key.Visible = i.Value;
                }
                cPanel.ResumeLayout();