在图片框中切换图像
Switching images in picturebox
在 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());
}
}
最后 'displaying' 必须在 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);
}
}
}
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);
}
}
});
我找到了一种目前运行良好的方法。
原来它已经在 Whosebug 上了,不幸的是我没有早点找到它: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);
在 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());
}
}
最后 'displaying' 必须在 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);
}
}
}
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);
}
}
});
我找到了一种目前运行良好的方法。 原来它已经在 Whosebug 上了,不幸的是我没有早点找到它: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);