Winforms 如何以高效的方式在TableLayoutPanel中显示对象数据

Winforms 如何以高效的方式在TableLayoutPanel中显示对象数据,winforms,performance,c#-4.0,optimization,tablelayoutpanel,Winforms,Performance,C# 4.0,Optimization,Tablelayoutpanel,我编写了以下代码来填充tablelayoutpanel控件中对象的数据。它可以工作(Smile |::),但当它将数据加载到表中时,它会闪烁/跳跃几秒钟,然后在2-3秒钟后,当它处理完数据时,它会填充数据皱眉|:(.我相信这种行为是因为编写了基于对象数据动态处理和绘制表中各种控件的代码 我需要您的帮助来优化代码/改进此代码的性能,以便能够平稳快速地加载表。请提供帮助。谢谢 PS:这段代码是为一个包含少量数据的表编写的。但今后,同样的代码计划用4倍的数据填充表。如果是这种情况,那么性能将非常差,这

我编写了以下代码来填充tablelayoutpanel控件中对象的数据。它可以工作(Smile |::),但当它将数据加载到表中时,它会闪烁/跳跃几秒钟,然后在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);
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
公共对象=新公共对象();
CreateDeserializedXmlObject(@“E:\TestReport.xml”);
var v=obj.GetAdminData();
tableLayoutPanel1.ColumnCount=4;
tableLayoutPanel1.RowCount=((v.DOCREVISIONS.Length*4)+1+(v.USEDLANGUAGES.L10.Length));
Label labelLanguage=新标签();
Label labelUsedLanguage=新标签();
Label labelDocRevisions=新标签();
labelLanguage.Text=“语言:”;
labelUsedLanguage.Text=“使用的语言:”;
labelDocRevisions.Text=“文档修订:”;
ComboBox comboBoxLanguage=新建ComboBox();
comboBoxLanguage.Items.Add(v.LANGUAGE.Value.ToString());
comboBoxLanguage.SelectedIndex=0;
ComboBox comboBoxUsedLanguage=新ComboBox();
foreach(v.USEDLANGUAGES.L10中的LPLAINTEXT Lang)
{
comboBoxUsedLanguage.Items.Add(Lang.L.ToString());
}
comboBoxUsedLanguage.SelectedIndex=0;
int指数=0;
Label[]labelDocRevision=新标签[v.DOCREVISIONS.Length];
标签[]labelRevision=新标签[v.DOCREVISIONS.Length];
标签[]标签状态=新标签[v.DOCREVISIONS.Length];
Label[]labelTeamMember=新标签[v.DOCREVISIONS.Length];
标签[]labelDate=新标签[v.DOCREVISIONS.Length];
TextBox[]textBoxRevision=新的TextBox[v.DOCREVISIONS.Length];
TextBox[]textBoxState=new TextBox[v.DOCREVISIONS.Length];
TextBox[]textBoxTeamMember=新的TextBox[v.DOCREVISIONS.Length];
TextBox[]textBoxDate=新文本框[v.DOCREVISIONS.Length];
foreach(v.DOCREVISIONS中的DOCREVISION dcr)
{
labelDocRevision[index]=新标签();
labelRevision[索引]=新标签();
labelState[索引]=新标签();
labelTeamMember[索引]=新标签();
labelDate[索引]=新标签();
textBoxRevision[索引]=新的TextBox();
textBoxState[index]=新的TextBox();
textBoxTeamMember[索引]=新的TextBox();
textBoxDate[索引]=新的TextBox();
labelDocRevision[index].Text=“DOCREVISION[”+index.ToString()+”]:”;
labelRevision[索引]。Text=“修订:”;
labelState[index].Text=“状态:”;
labelTeamMember[index].Text=“TeamMemberRef:”;
labelDate[index]。Text=“日期:”;
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();
索引++;
}
//将子控件添加到TableLayoutPanel并指定行和列
tableLayoutPanel1.Controls.Add(labelLanguage,0,0);
tableLayoutPanel1.Controls.Add(labelUsedLanguage,0,1);
tableLayoutPanel1.Controls.Add(LabelDorDevices,0,2);
tableLayoutPanel1.Controls.Add(comboBoxLanguage,1,0);
tableLayoutPanel1.Controls.Add(comboBoxUsedLanguage,1,1);
int docRevRowSpacing=2;
for(int-loop=0;loop
有两个小的改动对您有所帮助

在代码开始时,您可以调用。这可以防止每次向TableLayoutPanel添加控件时,TableLayoutPanel都会重新绘制自己。当您在调用的末尾添加完所有控件后,TableLayoutPanel将只重新绘制一次。这仍然需要时间,但至少大多数闪烁都消失了。在示例代码的末尾,您将看到一个将
TableLayoutPanel 1
再次添加到表单控件集合中。如果TableLayoutPanel位于表单设计器上,则不需要这样做,这样做会降低性能,因为现在有两个需要绘制的TableLayoutPanel

private void button1_Click(object sender, EventArgs e)
{
     tableLayoutPanel1.SuspendLayout();
     // all your other code goes here

     // not sure why you add the tableLayouyPanel AGAIN to the
     // form control collection. 
     // Controls.Add(this.tableLayoutPanel1);
     tableLayoutPanel1.ResumeLayout();
}
我在测试中注意到,调整表单大小会产生同样的闪烁效果
private void Form1_ResizeBegin(object sender, EventArgs e)
{
    tableLayoutPanel1.SuspendLayout();
}

private void Form1_ResizeEnd(object sender, EventArgs e)
{
    tableLayoutPanel1.ResumeLayout();
}