dinesh_redhawk Ответов: 1

C# - Как отобразить данные объекта в TableLayoutPanel. Оптимизация кода повышение производительности


Здравствуйте друзья,

Я написал следующий код для заполнения данных из объекта в элементе управления tablelayoutpanel. Он работает :), но когда он загружает данные в таблицу, он мерцает/прыгает в течение нескольких секунд, а затем через 2-3 секунды, когда он закончил обработку данных, он заполняет данные :( . я считаю, что это поведение связано с кодом, написанным для динамической обработки и рисования различных элементов управления в таблице на основе данных объекта.

Мне нужна ваша помощь в оптимизации кода/повышении производительности этого кода, чтобы таблица могла загружаться плавно и быстро. Пожалуйста помочь. Спасибо.

PS: этот код написан для таблицы, содержащей небольшое количество данных. Но в дальнейшем то же самое планируется сделать и для заполнения таблицы в 4 раза большим количеством данных. Если это так, то производительность будет очень плохой, что меня беспокоит. Пожалуйста, предложите несколько идей.

private void button1_Click(object sender, EventArgs e)
        {
            Common obj = new Common();
            obj.CreateDeserializedXmlObject(@"E:\TestReport.xml");
            var v = obj.GetAdminData();

            tableLayoutPanel1.ColumnCount = 4;
            tableLayoutPanel1.RowCount = ((v.DOCREVISIONS.Length * 4) + 1 + (v.USEDLANGUAGES.L10.Length));


            Label labelLanguage = new Label();
            Label labelUsedLanguage = new Label();
            Label labelDocRevisions = new Label();

            labelLanguage.Text = "Language:";
            labelUsedLanguage.Text = "Used Language:";
            labelDocRevisions.Text = "Doc-Revisions:";

            ComboBox comboBoxLanguage = new ComboBox();
            comboBoxLanguage.Items.Add(v.LANGUAGE.Value.ToString());
            comboBoxLanguage.SelectedIndex = 0;

            ComboBox comboBoxUsedLanguage = new ComboBox();
            foreach (LPLAINTEXT Lang in v.USEDLANGUAGES.L10)
            {
                comboBoxUsedLanguage.Items.Add(Lang.L.ToString());
            }
            comboBoxUsedLanguage.SelectedIndex = 0;
            int index = 0;

            Label[] labelDocRevision = new Label[v.DOCREVISIONS.Length];
            Label[] labelRevision = new Label[v.DOCREVISIONS.Length];
            Label[] labelState = new Label[v.DOCREVISIONS.Length];
            Label[] labelTeamMember = new Label[v.DOCREVISIONS.Length];
            Label[] labelDate = new Label[v.DOCREVISIONS.Length];

            TextBox[] textBoxRevision = new TextBox[v.DOCREVISIONS.Length];
            TextBox[] textBoxState = new TextBox[v.DOCREVISIONS.Length];
            TextBox[] textBoxTeamMember = new TextBox[v.DOCREVISIONS.Length]; 
            TextBox[] textBoxDate = new TextBox[v.DOCREVISIONS.Length];

            foreach (DOCREVISION dcr in v.DOCREVISIONS)
            {
                labelDocRevision[index] = new Label();
                labelRevision[index] = new Label();
                labelState[index] = new Label();
                labelTeamMember[index] = new Label();
                labelDate[index] = new Label();

                textBoxRevision[index] = new TextBox();
                textBoxState[index] = new TextBox();
                textBoxTeamMember[index] = new TextBox();
                textBoxDate[index] = new TextBox();

                labelDocRevision[index].Text = "DOCREVISION["+index.ToString()+"]:";
                labelRevision[index].Text = "Revision:";
                labelState[index].Text = "State:";
                labelTeamMember[index].Text = "TeamMemberRef:";
                labelDate[index].Text = "Date:";

                textBoxRevision[index].Text = dcr.REVISIONLABEL.Value.ToString();
                textBoxState[index].Text = dcr.STATE.Value.ToString();
                textBoxTeamMember[index].Text = dcr.TEAMMEMBERREF.Value.ToString();
                textBoxDate[index].Text = dcr.DATE.Value.ToString();
                
                index++;
            }
            
            
            // Add child controls to TableLayoutPanel and specify rows and column
            tableLayoutPanel1.Controls.Add(labelLanguage, 0, 0);
            tableLayoutPanel1.Controls.Add(labelUsedLanguage, 0, 1);
            tableLayoutPanel1.Controls.Add(labelDocRevisions, 0, 2);
            tableLayoutPanel1.Controls.Add(comboBoxLanguage, 1, 0);
            tableLayoutPanel1.Controls.Add(comboBoxUsedLanguage, 1, 1);

            int docRevRowSpacing = 2;
            for (int loop = 0; loop < index; loop++)
            {
                tableLayoutPanel1.Controls.Add(labelDocRevision[loop], 1, docRevRowSpacing);
                tableLayoutPanel1.Controls.Add(labelRevision[loop], 2, docRevRowSpacing);
                tableLayoutPanel1.Controls.Add(labelState[loop], 2, docRevRowSpacing+1);
                tableLayoutPanel1.Controls.Add(labelTeamMember[loop], 2, docRevRowSpacing+2);
                tableLayoutPanel1.Controls.Add(labelDate[loop], 2, docRevRowSpacing+3);

                tableLayoutPanel1.Controls.Add(textBoxRevision[loop], 3, docRevRowSpacing);
                tableLayoutPanel1.Controls.Add(textBoxState[loop], 3, docRevRowSpacing+1);
                tableLayoutPanel1.Controls.Add(textBoxTeamMember[loop],3 , docRevRowSpacing+2);
                tableLayoutPanel1.Controls.Add(textBoxDate[loop], 3, docRevRowSpacing+3);

                docRevRowSpacing += 4;
            }

            tableLayoutPanel1.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
            Controls.Add(this.tableLayoutPanel1);
        }

1 Ответов

Рейтинг:
0

Staffan Bruun

Попробуйте поместить код, генерирующий новые элементы управления, между парой SuspendLayout/ResumeLayout:

private void button1_Click(object sender, EventArgs e)
{
    SuspendLayout();

    // code that recreates controls on the form

    ResumeLayout();
}


Это позволит окну не пытаться выкладывать/перерисовывать элементы управления, пока они еще создаются.

Вы также можете рассмотреть возможность использования элемента управления data grid; таким образом, вам не придется создавать элементы управления самостоятельно.


[no name]

@Стефан: Спасибо за предложение. Я попробовал это сделать, но, к сожалению, безрезультатно.
Проводя некоторые испытания, я обнаружил, что изменение стиля CellBorderStyle с Single на None ускоряет работу. Кроме того, я попытался скрыть tablelayout перед обработкой данных и показать его после того, как все будет сделано, это также помогает.

Элемент управления DataGridView был моим первоначальным выбором, но я столкнулся с большим количеством проблем при привязке объекта (источника) к Datagrid, а также было трудно добавлять различные элементы управления в требуемом макете, в datagrid. Поэтому я переключился на TableLayout.

Если кто-нибудь может предложить некоторую оптимизацию для моего кода, то это будет полезно.
Спасибо тебе :)