3

我有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);
        }
    }

但我得到这个错误

错误 1 ​​不可调用的成员 'System.Windows.Forms.Control.Controls' 不能像方法一样使用。C:\Users\test\Desktop\WindowsFormsApplication1\Form1.cs 22 37 WindowsFormsApplication1

4

3 回答 3

4

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

ThreadPool.QueueUserWorkItem(_ =>
{
    foreach (var pb in this.Controls.OfType<PictureBox>())
    {
        pb.BackColor = Color.Red;
        Thread.Sleep(2000);
     }
 });

作为对杰夫布里奇曼的回应:

我也很惊讶他没有得到异常,但我测试了它,它工作正常。只是为了完整性(根据调用此代码的位置,它可能会导致异常),这是一个安全的版本:

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;在循环内使用的注释(我从同事那里得到了这个问题)。是来自 ReSharper wiki 的一个很好的解释。

于 2013-10-06T14:23:36.413 回答
3

听起来你需要类似的东西;

foreach(var pb in this.Controls.OfType<PictureBox>())
{
    pb.BackColor = Color.Red;
    Thread.Sleep(2000);
}
于 2013-10-06T14:06:54.813 回答
1

问题是Controls集合不是方法,而是表单的属性,而错误正是说,不能像方法一样使用。

简而言之,改变这一行:

foreach (var pb in this.Controls().OfType<PictureBox>())

对此:

foreach (var pb in this.Controls.OfType<PictureBox>())

注意后面缺少的括号Controls

于 2013-10-06T14:19:40.557 回答