1

我在智能设备项目中长时间绘制控件时遇到问题。

这是冻结应用程序的代码~11s

SAdr = this.ExecuteSQL("select * from dba." + table);
while (SAdr.Read())
{
    PictureBox pBox = new PictureBox();
    pBox.Image = Program.ByteArrayToImage((byte[])SAdr["IMGDATA"]);
    pBox.Name = String.Format("pictureBox{0}#{1}",nameKey ,Int16.Parse(SAdr[colName].ToString()));
    pBox.Width = pBox.Height = size;
    pBox.Left = marginL;
    pBox.Top = marginT;
    pBox.SizeMode = PictureBoxSizeMode.StretchImage;
    pBox.Click += new EventHandler(pBoxTow_Click);

    if (counter < cols)
        marginL += size + space;
    else
    {
        marginL = 10;
        marginT += size + space;
        counter = 0;
    }
    panel.Controls.Add(pBox);
    counter++;
}
panelCenter.Controls.Clear();
panelCenter.Controls.Add(panel);

这个时间是逐行测量SAdr = this.ExecuteSQL("select * from dba." + table);panelCenter.Controls.Clear();

任何想法如何改进此代码?

4

2 回答 2

1

您的单线程应用程序正在从数据库中获取数据,并且在该操作期间您的 GUI 冻结。您应该考虑从不同的线程访问数据库。

于 2012-09-26T10:49:23.060 回答
1

将表中的数据读入一个数组(可能是数组,以存储图像)。然后一旦数据读取完成,才开始创建控件。从本地数组填充图片框将比从表中读取每个项目并同时填充它更快。

通过使用数组将数据库操作与 GUI 操作分开。

于 2012-09-26T10:51:11.810 回答