【问题标题】:using the loop to reach out to pictureBoxes使用循环访问图片框
【发布时间】:2013-10-06 14:03:20
【问题描述】:

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

【问题讨论】:

    标签: c#


    【解决方案1】:

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

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

    【讨论】:

    • 不用担心。很高兴能提供帮助。
    • 你没有得到跨线程异常?你不需要回到 UI 线程吗?
    • @JeffBridgman:查看更新(我也很惊讶它没有导致异常)。
    【解决方案2】:

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

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

    【讨论】:

    • 那是因为Controls 不是一个方法,它是一个属性。只需省略 ():var pb in this.Controls.OfType&lt;PictureBox&gt;()
    • @Lasooch Ups!我的错。已更新。
    • 现在它冻结整个应用程序,然后立即将图片框变成红色。
    • 也许尝试添加一个 Invalidate() 调用?我不确定,现在无法测试。
    【解决方案3】:

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

    简而言之,改变这一行:

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

    到这里:

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

    注意Controls后面缺少的括号

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      相关资源
      最近更新 更多