1

使用 TableLayoutPanel 时,我面临着令人讨厌的性能问题。我有一个带有 RadioButton 和 LinkLabel 的简单用户控件。LinkLabel 的文本是动态的,因此整个控件的 AutoSize 属性设置为 true。

现在我有一个面板,其中 AutoScroll 设置为 true,TableLayoutPanel 自动调整大小,里面有 2 列。此 TableLayoutPanel 填充了上述用户控件:

private void PopulateLocationItemsTable(Control[] Controls)
{
    //Suspend outher Panel and set AutoScroll to false just in case.
    panelLocationItemsTableCountainer.SuspendLayout();
    panelLocationItemsTableCountainer.AutoScroll = false;
    //Suspend TableLayoutPanel
    tableLocationItems.SuspendLayout();
    Controls = Controls.OrderBy(c => c.Text).ToArray();
    //Populate left column
    int verticalPosition = 3;
    int leftColumnControlsNumber = Controls.Length / 2;
    for (int i = 0; i < leftColumnControlsNumber; i++)
    {
       tableLocationItems.Controls.Add(Controls[i], 0,0);
       Controls[i].Location = new Point(10, verticalPosition);
       verticalPosition += 17;
    }
    //Populate right column
    verticalPosition = 3;
    for (int i = leftColumnControlsNumber; i < Controls.Length; i++)
    {
        tableLocationItems.Controls.Add(Controls[i], 0, 1);
        Controls[i].Location = new Point(10, verticalPosition);
        verticalPosition += 17;
    }
    //Resume TableLayoutPanel
    tableLocationItems.ResumeLayout(true);
    //And restore outher Panel state
    panelLocationItemsTableCountainer.AutoScroll = true;
    panelLocationItemsTableCountainer.ResumeLayout(true);
}

问题是用户控件最初填充在 FormLoad 事件中,并且 Form 在实际出现之前只挂起大约 10 秒。这对我来说是完全不能接受的。

如果我将用户控件的 AutoSize 属性设置为 false,此问题就会消失。我还尝试将用户控件直接放在外部面板上,它也可以正常工作。问题出在 TableLayoutPanel 上。有没有人遇到过这样的问题并找到了解决方案?当然,我可以将我的用户控件直接放置在计算正确坐标的面板上,但使用 TableLayoutPanel 是此类任务的“正确”方式。

4

1 回答 1

1

使用 TableLayoutPanel 是正确的方法,但您需要将该控件中的列视为静态宽度。我有一个应用程序,我在使用该面板时遇到了几乎完全相同的问题,并意识到我一直在看错。

如果有两列,并且我的容器(例如表单)是 300 像素宽,那么每列是 150 像素宽(减去填充和填充),因此这些列内的控件必须做出反应,而不是列做出反应。

您真正需要以这种方式看待它的另一个原因是,引擎不会首先在内存中布局所有内容(就像 WPF 框架所做的那样),因此它的核心效率非常高,因为它会立即提交更改。

于 2013-04-11T03:48:52.910 回答