SuspendLayout / ResumeLayout是否毫无价值,还是我错了?

时间:2012-08-20 23:11:17

标签: c# winforms dynamic tabs tablelayoutpanel

我有两个托管TableLayoutPanel的标签页,我用标签和文本框动态填充。第一个获得96个标签和96个文本框,其闪烁是可接受/可容忍的,所以我没有费心添加SuspendLayout / ResumeLayout对。

然而,第二个获得96个标签和288个文本框,其绘画/闪烁是无法容忍的。 IOW,192个控件似乎没问题,但384肯定不是。

我在动态创建控件之前调用SuspendLayout,然后在finally块中调用ResumeLayout,但删除了它们,瞧!像第一个tabPage / TLP一样,闪烁是可以接受的。

为什么通过减法进行加法工作?

2 个答案:

答案 0 :(得分:5)

你也可以试试我在这个帖子中列出的两种方法。希望他们不是太神秘了:

https://stackoverflow.com/a/15020157/1307504

此方法确实暂停并恢复布局。但你永远不要忘记致电EndControlUpdate()

我在我正在创造的任何一般控制中使用它。我尝试了暂停和恢复布局,尝试了很多。它从来没有像我想象的那样工作。

答案 1 :(得分:1)

最初,我同样怀疑SuspendLayoutResumeLayout是否真的有效。然后我尝试了自己并创建了一个示例应用程序,并在以后更好地了解了这个概念。

所以,这就是我所做的:

mainPanel.SuspendLayout()

create child control

call child.SuspendLayout()

change the child control properties

add the child control to the mainPanel

call child.ResumeLayout(false) - this means: next layout run, relayout this control, but not immediately

repeat (2-6) for every child-control

call mainPanel.ResumeLayout(true) - this means: relayout my mainPanel and every child-control now!

同样要证明我的概念以下是样本申请

Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();

        this.SuspendLayout();
        for (int i = 0; i < 2000; i++)
        {
            var textbox = new TextBox();
            //textbox.SuspendLayout();
            //textbox.Dock = i% 2 ==0 ? DockStyle.Left : DockStyle.Right;
            textbox.Dock = DockStyle.Fill;
            textbox.Top = i * 10;
            textbox.Text = i.ToString();
            this.Controls.Add(textbox);
            //textbox.ResumeLayout(false);

        }
        stopWatch.Stop();
        TimeSpan ts = stopWatch.Elapsed;
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",ts.Hours, ts.Minutes, ts.Seconds,ts.Milliseconds / 10);

        this.ResumeLayout(true);
        MessageBox.Show(elapsedTime);