在图片框中切换图像



在Windows窗体应用程序中,我必须在一个图片框中显示几个(或更多)图像 - 它们需要每10秒(或类似)更改一次。
我首先从数据库中检索图像,并将它们显示在特定的图片框中。
每个图像都有一个唯一的ID,只有一个图像一切正常。

我有SQL数据库(SQL Server 2014)并使用LINQ。

public void displayAdds(ImageAd img, int imgid)
    {
         using (var dbContext = new LinqClassesDataContext())
        {
            var table = from t in dbContext.ImageAds
                        where t.Id == imgid
                        select t;
            img.image = table.Single().image;
            pictureBox1.Image = ByteArrayToImage(img.image.ToArray());
        }
    }

最后,"显示"必须在foreach循环中,因为我将有一个整数列表(List),因此我只能显示具有选定ID的图像。

我尝试使用线程或刷新,像这样的简单循环不起作用:

for(int i=0; i<5; i++)
 {
    displayAdds(img, i);
   }

以下是我尝试过但不起作用的其他方法。

public void displayAd(ImageAd img)
    {
        int i = 1;
        using (var dbContext = new LinqClassesDataContext())
        {
            while (true)
            {
                var table = from t in dbContext.ImageAds
                            where t.Id == i
                            select t;
                img.image = table.Single().image;
                pictureBox1.Image = ByteArrayToImage(img.image.ToArray());
                Thread.Sleep(1000);
                i++;
                if (i >= 15)
                    i = 1;
            }
        }
    }

    public void displayList(ImageAd img)
    {
        using (var dbContext = new LinqClassesDataContext())
        {
            for (int i = 0; i < 5; i++)
            {
                var table = from t in dbContext.ImageAds
                            where t.Id == i
                            select t;
                img.image = table.Single().image;
               // pictureBox1.Image = ByteArrayToImage(img.image.ToArray());
                PictureBox pb = new PictureBox();
                //254,15
                pb.Location = new Point(254, 15);
                pb.Size = new Size(310, 367);
               // pb.BorderStyle = BorderStyle.Fixed3D;
                pb.Image = ByteArrayToImage(img.image.ToArray());
                pb.Cursor = System.Windows.Forms.Cursors.Hand;
                this.Controls.Add(pb);
                pb.BringToFront();
                Thread.Sleep(1000);
            }
        }
    }

我找到了一种到目前为止工作正常的方法。事实证明,它已经在StackOverflow上,不幸的是我之前没有找到它: 快速更改图片框中的图像

我是这样用的:

     var table = from t in dbContext.ImageAds where t.Id == i select t;
                    img.image = table.Single().image;
                    pictureBox1.Image = ByteArrayToImage(img.image.ToArray());
                    pictureBox1.Refresh();
                    await Task.Delay(1000);
var array = Enumerable.Range(1,15).ToArray();
//First get all image from db
var images = from t in dbContext.ImageAds
    where array.Contains(t.Id)
    select t.image;
//create thread for delay to prevent freezing screen
Task.Factory.StartNew(() =>
{
    while (true)
    {
        foreach (var img in array)
        {
            // call method in ui thread
            this.Invoke((MethodInvoker)delegate //this: form control
            {
                pictureBox1.Image = ByteArrayToImage(img.ToArray());
            });
            Thread.Sleep(1000);                        
        }
    }
});

相关内容

  • 没有找到相关文章