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 に答える