TableLayoutPanel具有嵌套的自动化用户控件性能问题

时间:2013-04-11 03:39:28

标签: c# winforms

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

现在我有一个Panel,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上。有人遇到过这样的问题并找到了解决办法吗?我可以将我的用户控件自己直接放到Panel计算权限coordinales,但是使用TableLayoutPanel是一个正确的&#34;这种任务的方式。

1 个答案:

答案 0 :(得分:1)

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

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

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