Доброго времени суток!
Не устраивает время создания контролов (6 секунд)
tcManualWorkSpace.TabPages.Add("1");
FlowLayoutPanel flpManualWorkPlace = new FlowLayoutPanel();
flpManualWorkPlace.Dock = DockStyle.Fill;
tcManualWorkSpace.TabPages[i].Controls.Add(flpManualWorkPlace);
ComboBox[] cbIN = new ComboBox[128];
Label [] lIN = new Label [128];
for (int ii = 0; ii < 128; ii++)
{
lIN[ii] = new Label();
cbIN[ii] = new ComboBox();
for(int iii = 0; iii < SC_r.SC.Optical_switch_List[i].IN; iii++)
cbIN[ii].Items.Add(iii+1);
lIN[ii].Text = Convert.ToString(ii+1);
flpManualWorkPlace.Controls.Add(lIN[ii]);
flpManualWorkPlace.Controls.Add(cbIN[ii]);
}
Каким образом можно уменьшить время создания контролов?
Здравствуйте, alsot, Вы писали:
A>Доброго времени суток! A>Не устраивает время создания контролов (6 секунд)
A>
A>tcManualWorkSpace.TabPages.Add("1");
A>FlowLayoutPanel flpManualWorkPlace = new FlowLayoutPanel();
A>flpManualWorkPlace.Dock = DockStyle.Fill;
A>tcManualWorkSpace.TabPages[i].Controls.Add(flpManualWorkPlace);
A>ComboBox[] cbIN = new ComboBox[128];
A>Label [] lIN = new Label [128];
A>for (int ii = 0; ii < 128; ii++)
A>{
A> lIN[ii] = new Label();
A> cbIN[ii] = new ComboBox();
A> for(int iii = 0; iii < SC_r.SC.Optical_switch_List[i].IN; iii++)
A> cbIN[ii].Items.Add(iii+1);
A> lIN[ii].Text = Convert.ToString(ii+1);
A> flpManualWorkPlace.Controls.Add(lIN[ii]);
A> flpManualWorkPlace.Controls.Add(cbIN[ii]);
A>}
A>
A>Каким образом можно уменьшить время создания контролов?
Дочитал до второго цикла, где переменная ii и думаю "А если третий вложенный цикл будет — переменную iii назовешь?" Опускаю глаза — смотрю третий цикл и iii =)
Простите, не удержался
читать код тяжело.. В общем, попробуйте убедиться в том, что добавление контролов в родительский контрол делается в последнюю очередь. Т.е. создаем что-то мелкое — добавляем в более крупное, и в самом конце уже добавляем вашу flpManualWorkSpace в tcManualWorkSpace. Ну еще, если это WinForms, то поищите как пользоваться SuspendLayout/ResumeLayout, и во всех случаях — ISupportInitialize..
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, alsot, Вы писали:
A>>Не устраивает время создания контролов (6 секунд)
_FR>Так же имеет смысл показать код, из которого это всё вызывается. Конструктор формы? Обработчик какого-то события?
Здравствуйте, notacat, Вы писали:
N>читать код тяжело.. В общем, попробуйте убедиться в том, что добавление контролов в родительский контрол делается в последнюю очередь. Т.е. создаем что-то мелкое — добавляем в более крупное, и в самом конце уже добавляем вашу flpManualWorkSpace в tcManualWorkSpace. Ну еще, если это WinForms, то поищите как пользоваться SuspendLayout/ResumeLayout, и во всех случаях — ISupportInitialize..
tcManualWorkSpace.TabPages.Add("1");
FlowLayoutPanel flpManualWorkPlace = new FlowLayoutPanel();
flpManualWorkPlace.Dock = DockStyle.Fill;
ComboBox[] cbIN = new ComboBox[128];
Label [] lIN = new Label [128];
this.SuspendLayout();
for (int ii = 0; ii < 128; ii++)
{
lIN[ii] = new Label();
cbIN[ii] = new ComboBox();
for(int iii = 0; iii < SC_r.SC.Optical_switch_List[i].IN; iii++)
cbIN[ii].Items.Add(iii+1);
lIN[ii].Text = Convert.ToString(ii+1);
flpManualWorkPlace.Controls.Add(lIN[ii]);
flpManualWorkPlace.Controls.Add(cbIN[ii]);
}
tcManualWorkSpace.TabPages[i].Controls.Add(flpManualWorkPlace);
this.ResumeLayout();
Вставки SuspendLayout() и ResumeLayout() эффекта не дали.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, alsot, Вы писали:
A>>Вставки SuspendLayout() и ResumeLayout() эффекта не дали.
_FR>1. Вызвать нужно у всех контейнеров. _FR>2. Привыкайте оборачивать такие вызовы в try/finally.
Вызвал у всех
строка
Здравствуйте, alsot, Вы писали:
A>>>Вставки SuspendLayout() и ResumeLayout() эффекта не дали. _FR>>1. Вызвать нужно у всех контейнеров. A>выполняется долго как c суспендом, так и без него.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, alsot, Вы писали:
A>>>>Вставки SuspendLayout() и ResumeLayout() эффекта не дали. _FR>>>1. Вызвать нужно у всех контейнеров. A>>выполняется долго как c суспендом, так и без него.
_FR>Тогда сначала сделать так
, и уж если всё равно не поможет, то запустить профайлер, который и покажет узкое место, над которым и надо будет думать.
_FR>Кстати, значения SC_r.SC.Optical_switch_List[i].IN в каком диапазоне лежат?
A>>Какое отношение имеет try/finally к сабжу?
_FR>Тоже, что и имена вроде "SC_r.SC.Optical_switch_List[i].IN", "ii" и "iii".
Исправил порядок инициализации контролов. Узкое место —
for(int iii = 0; iii < SC_r.SC.Optical_switch_List[i].IN; iii++)
cbIN[ii].Items.Add(iii+1);
Здравствуйте, alsot, Вы писали:
_FR>>Кстати, значения SC_r.SC.Optical_switch_List[i].IN в каком диапазоне лежат?
A>Исправил порядок инициализации контролов.
Как я догадываюсь — не помогло?
A>Узкое место -
A>for(int iii = 0; iii < SC_r.SC.Optical_switch_List[i].IN; iii++)
A> cbIN[ii].Items.Add(iii+1);
A>где SC_r.SC.Optical_switch_List[i].IN = 128
Всё понятно: оба цикла прокручиваются 128 * 128 раз, создаётся 128 * 2 элементов управления, причём в 128 из них по 128 строк. Все эти элементы нужно ещё и отлайоутить, а таблицы лайоута в WinForms — те ещё тормоза. ИМХО, нужно в консерватории что-то править, то есть придумать другой способ отображения информации. Для этого полезно апообщаться в более специализированном форуме Пользовательский интерфейс: проектирование, usability.
Help will always be given at Hogwarts to those who ask for it.