2013-04-11 53 views
1

我在使用TableLayoutPanel時遇到了令人討厭的性能問題。我有一個簡單的用戶控件與RadioButton和LinkLabel。 LinkLabel的文本是動態的,因此整個控件都將AutoSize屬性設置爲true。帶嵌套自動化用戶控件性能問題的TableLayoutPanel

現在我有一個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。有沒有人遇到過這樣的問題並找到解決方案?我可以將我的用戶控件直接放到面板上,計算正確的座標,但使用TableLayoutPanel是這種任務的「正確」方法。

回答

1

使用TableLayoutPanel是正確的方法,但您需要將該控件中的列視爲靜態寬度。我有一個應用程序,我面對使用該面板幾乎完全相同的問題,並意識到我只是看着這一切都錯了。

如果有兩列,而我的容器(例如一個表單)的寬度是300像素,那麼每一列的寬度是150像素(減去填充和填充),所以這些列內的控件必須反應而不是列反應。

你真的需要這樣看待的另一個原因是因爲引擎並沒有首先在內存中佈置所有內容(就像WPF框架一樣),所以它的核心效率非常高,因爲它立即提交更改。

+0

感謝您的回覆。閱讀完後,我想出瞭解決這個問題的方法。不優雅,但工作得很快。由於我的窗體具有靜態寬度,我實際上並不需要內部用戶控件的自動大小。我可以將它們的寬度設置爲匹配TableLayoutPanel列的完整寬度。當內部用戶控件具有固定寬度時,此性能問題將消失。謝謝。 – Shoar 2013-04-11 16:29:26