Динамическое создание панели макета таблицы занимает слишком много времени - PullRequest
2 голосов
/ 01 июля 2011

Я работаю над приложением WinForms на C #. Изначально у меня есть панель макетов таблиц, в которую я заполняю динамически созданные кнопки, по одной для каждой ячейки. Это работает хорошо и довольно быстро. Во время выполнения программы я должен очистить эту панель раскладки таблиц и снова заполнить ее, в основном с тем же дисплеем, но с большим количеством кнопок (в два раза больше, чем в исходной таблице). Проблема в том, что этот процесс занимает много времени (более 10 секунд). Я делаю что-то неправильно? Это код:

buttonTable.Controls.Clear();
buttonTable.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
buttonTable.RowCount = GetNoOfLines();
buttonTable.ColumnCount = GetNoOfLines();

for (int z = 1; z <= GetNoOfLines(); z++)
{
    buttonTable.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 25));
    buttonTable.RowStyles.Add(new RowStyle(SizeType.Absolute, 25));
}

for (int i = 1; i <= GetNoOfLines(); i++)
{
    for (int j = 1; j <= GetNoOfLines(); j++)
    {
        FieldButton tempButton = new FieldButton(i, j, GetNoOfLines());
        tempButton.MouseDown += new MouseEventHandler(OnFieldButtonClicked);

        buttonTable.Controls.Add(tempButton, j - 1, i - 1);
     }
 }

Примечание: FieldButton - это класс, производный от Button, к которому я добавил два int's, ничего особенного в этом нет. Также кнопки правильно добавлены в таблицу. Спасибо!

Ответы [ 3 ]

7 голосов
/ 02 июля 2011

У меня были проблемы с производительностью TableLayoutPanel, пока я не прочитал этот поток и не создал пользовательский элемент управления, который установил свойство DoubleBuffered.

public class DoubleBufferedTableLayoutPanel :TableLayoutPanel
{
    public DoubleBufferedTableLayoutPanel()
    {
        DoubleBuffered = true;
    }
}

Попробуйте этот элемент управления вместо стандартной TableLayoutPanel. Я рекомендую приостановить и возобновить макет во время заполнения таблицы.

2 голосов
/ 02 июля 2011

Отсоедините buttonTable от формы и присоедините сразу после того, как вы закончите добавлять элементы управления к ней. Работает нормально таким образом.

0 голосов
/ 01 июля 2011

Попробуйте использовать SuspendLayout() и ResumeLayout() до и после добавления кода, чтобы уменьшить время, необходимое для перекраски кнопок.Это должно уменьшиться через некоторое время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...