使用循环来触及pictureBoxes

时间:2013-10-06 14:03:20

标签: c#

我在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

3 个答案:

答案 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

后的缺失括号