我在C#中有pictureBox1,pictureBox2,picturebox3,....有没有办法可以用循环改变第一个图片框背景颜色,等待,然后改变pictureBox2的背景?
会是这样的
private void button1_Click(object sender, EventArgs e)
{
foreach (var pb in this.Controls.OfType<PictureBox>())
{
pb.BackColor = Color.Red;
Thread.Sleep(2000);
}
}
但我收到此错误
错误1非可调用成员'System.Windows.Forms.Control.Controls' 不能像一个人一样使用 方法。 C:\ Users \ test \ Desktop \ WindowsFormsApplication1 \ Form1.cs 22 37 WindowsFormsApplication1
答案 0 :(得分:4)
尝试使用线程池(正如有些人已经注意到的,这可能会导致线程异常,虽然它不适用于我的测试或者对你来说......将取决于我相信你调用此代码的位置):
ThreadPool.QueueUserWorkItem(_ =>
{
foreach (var pb in this.Controls.OfType<PictureBox>())
{
pb.BackColor = Color.Red;
Thread.Sleep(2000);
}
});
回复Jeff Bridgman:
我也很惊讶他没有得到例外,但我测试了它并且工作正常。只是为了完整性(它可能会导致异常取决于调用此代码的位置),这是一个安全的版本:
ThreadPool.QueueUserWorkItem(_ =>
{
foreach (var pb in Controls.OfType<PictureBox>())
{
var pb1 = pb;
pb1.BeginInvoke((Action) (() =>
{
pb1.BackColor = Color.Red;
}));
Thread.Sleep(2000);
}
});
请注意我在循环中使用var pb1 = pb;
的原因(我从同事那里得到了这个问题)。 Here是ReSharper wiki的一个很好的解释。
答案 1 :(得分:3)
听起来你需要这样的东西;
foreach(var pb in this.Controls.OfType<PictureBox>())
{
pb.BackColor = Color.Red;
Thread.Sleep(2000);
}
答案 2 :(得分:1)
问题是Controls
集合不是方法,而是表单的属性,而错误恰恰说明了,不能像方法那样使用。
简而言之,请更改此行:
foreach (var pb in this.Controls().OfType<PictureBox>())
对此:
foreach (var pb in this.Controls.OfType<PictureBox>())
请注意Controls