【问题标题】:Switching images in picturebox切换图片框中的图像
【发布时间】:2015-08-29 22:39:07
【问题描述】:

在 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);

            }
        }
    }

【问题讨论】:

  • 让我猜猜,您的应用程序冻结了吗?你不能像这样使用 Thread.Sleep 。尝试熟悉 Timer,首先要了解它的 Tick 事件。
  • 实际上当它应该传递给带有图像的表单时会抛出异常

标签: c# image winforms linq picturebox


【解决方案1】:

我找到了一种到目前为止运行良好的方法。 原来它已经在 StackOverflow 上,不幸的是我之前没有找到它:Changing image in picture box rapidly

我是这样使用它的:

     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);

【讨论】:

    【解决方案2】:
    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);                        
            }
        }
    });
    

    【讨论】:

    • 它几乎有帮助,我调整了代码并且我有类似空引用异常的东西。你能帮我找出问题吗?代码如下:paste.ofcode.org/YGvBXhQTrXhWJQgzNgdJjF
    • @leapp 这个答案是方法不正确的代码,所以你必须在你的代码中采用这个代码并解决你尝试中可能出现的问题。
    • @leapp 但是发生了哪一行异常?
    • 这张图片Box1.Image = ByteArrayToImage(imga.image.ToArray());
    • 所以我不应该将您的代码放在一种方法中?你能指导我该怎么做吗?我真的需要一些提示,因为我知道我不会自己解决所有问题(我已经尝试过,而且我在线程和 C# 中查询 db 方面有点新)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多