2013-04-11 3 views
1

Я столкнулся с неприятной проблемой производительности при использовании TableLayoutPanel. У меня есть простой пользовательский контроль с RadioButton и LinkLabel. Текст LinkLabel является динамическим, поэтому весь элемент управления имеет свойство AutoSize, равное true.TableLayoutPanel с вложенным авторизованным пользовательским элементом управления производительностью

Теперь у меня есть панель с AutoScroll, установленная в true и TableLayoutPanel с авторазмерным размером и с двумя столбцами внутри нее. Это 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 случае и форма просто висит около 10 секунд, прежде чем он на самом деле появляется. Для меня это совершенно неприемлемо.

Эта проблема уходит, если я установил свойство AutoSize элемента управления пользователя на false. Я также попытался установить пользовательские элементы управления непосредственно на панель управления, и он также отлично работает. Проблема заключается только в TableLayoutPanel. Кто-нибудь сталкивался с такой проблемой и нашел решение? Из корса я могу разместить свой пользовательский контроль непосредственно непосредственно на панели, вычисляя правильные координаты, но использование TableLayoutPanel является «правильным» способом для таких задач.

ответ

1

Использование TableLayoutPanel - это правильный подход, но вы должны думать о столбцах в этом элементе управления как о статической ширине. У меня было приложение, где я столкнулся почти с той же проблемой, используя эту панель, и понял, что я просто смотрел на все это неправильно.

Если есть два столбца, а мой контейнер (например, форма) имеет ширину 300 пикселей, то каждый столбец имеет ширину 150 пикселей (минус заполнение и прочее), поэтому элементы управления внутри этих столбцов должны реагировать, а не столбцы, реагирующие ,

Другая причина, по которой вам действительно нужно смотреть на это, заключается в том, что вначале движок не компонует все в памяти (как и в среде WPF), поэтому он очень эффективен в своем ядре, так как он немедленно совершает изменения.

+0

Благодарим за отзыв. После прочтения я придумываю решение этой проблемы. Не изящно, но быстро работает. Поскольку моя форма имеет статическую ширину, мне не нужны внутренние пользовательские элементы управления, которые можно настроить автоматически. Я могу просто установить их ширину, чтобы она соответствовала полной ширине столбца TableLayoutPanel. Когда внутренние пользовательские элементы управления имеют фиксированную ширину, проблема с производительностью уходит. Спасибо вам. – Shoar

Смежные вопросы