C# 使用循环访问PictureBox

C# 使用循环访问PictureBox,c#,C#,我有pictureBox1,pictureBox2,picturebox3。。。。在C#中,是否有一种方法可以使用循环更改第一个picturebox背景色,然后等待,然后更改pictureBox2的背景 是这样的吗 private void button1_Click(object sender, EventArgs e) { foreach (var pb in this.Controls.OfType<PictureBox>())

我有pictureBox1,pictureBox2,picturebox3。。。。在C#中,是否有一种方法可以使用循环更改第一个picturebox背景色,然后等待,然后更改pictureBox2的背景

是这样的吗

    private void button1_Click(object sender, EventArgs e)
    {
        foreach (var pb in this.Controls.OfType<PictureBox>())
        {
            pb.BackColor = Color.Red;
            Thread.Sleep(2000);
        }
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
foreach(this.Controls.OfType()中的var pb)
{
pb.BackColor=Color.Red;
《睡眠》(2000年);
}
}
但是我得到了这个错误

错误1非发票成员“System.Windows.Forms.Control.Controls” 不能像一个 方法。C:\Users\test\Desktop\WindowsFormsApplication1\Form1.cs 22 37 WindowsFormsApplication1


听起来你需要这样的东西

foreach(var pb in this.Controls.OfType<PictureBox>())
{
    pb.BackColor = Color.Red;
    Thread.Sleep(2000);
}
foreach(this.Controls.OfType()中的var pb)
{
pb.BackColor=Color.Red;
《睡眠》(2000年);
}

问题在于,
控件
集合不是一个方法,而是表单的一个属性,错误正好说明,不能像方法一样使用

简而言之,更改此行:

foreach (var pb in this.Controls().OfType<PictureBox>())
foreach(类型()的this.Controls()中的var pb)
为此:

foreach (var pb in this.Controls.OfType<PictureBox>())
foreach(this.Controls.OfType()中的var pb)
注意
控件

后缺少的括号请尝试使用线程池(正如一些人所指出的,这可能会导致线程异常,尽管它不适用于我的测试或您…将取决于您从何处调用此代码,我相信):

ThreadPool.QueueUserWorkItem(=>
{
foreach(this.Controls.OfType()中的var pb)
{
pb.BackColor=Color.Red;
《睡眠》(2000年);
}
});
代表杰夫·布里奇曼:

我也很惊讶他没有出现异常,但我测试了一下,效果很好。不过,为了完整起见(这可能会导致异常,具体取决于从何处调用此代码),以下是一个安全版本:

ThreadPool.QueueUserWorkItem(_ =>
{
    foreach (var pb in Controls.OfType<PictureBox>())
    {
        var pb1 = pb;
        pb1.BeginInvoke((Action) (() =>
            {
                pb1.BackColor = Color.Red;
            }));
        Thread.Sleep(2000);
    }
});
ThreadPool.QueueUserWorkItem(=>
{
foreach(Controls.OfType()中的var pb)
{
var pb1=pb;
pb1.BeginInvoke((动作)(()=>
{
pb1.BackColor=颜色。红色;
}));
《睡眠》(2000年);
}
});

请注意我为什么使用
var pb1=pb在循环中(我的一个同事问了我这个问题)。这是ReSharper wiki的一个很好的解释。

这是因为
控件
不是一个方法,而是一个属性。只需在这个.Controls.OfType()中省略():
var pb
@Lasooch Ups!我的错误。已更新。现在它冻结了整个应用程序,然后立即将pictureboxes变为红色。是否可以尝试添加Invalidate()调用?我不确定,现在不能测试。不用担心。很高兴为您提供帮助。您没有从中获得跨线程异常吗?你不需要回到UI线程上?@JeffBridgman:请看更新(我也很惊讶它没有引起异常)。
ThreadPool.QueueUserWorkItem(_ =>
{
    foreach (var pb in Controls.OfType<PictureBox>())
    {
        var pb1 = pb;
        pb1.BeginInvoke((Action) (() =>
            {
                pb1.BackColor = Color.Red;
            }));
        Thread.Sleep(2000);
    }
});