循环图片框

时间:2012-04-11 17:23:38

标签: c# for-loop picturebox

我需要在一个周期内处理很多图片框。我怎样才能做到这一点?我试过这个:

    for (int i = 1; i <= 10; i++)
    {
        PictureBox[] pb = new PictureBox[i];
        pb[i].Image = global::Ippodrom.Properties.Resources.horse;
    }

但它崩溃了:

An unhandled exception of type 'System.IndexOutOfRangeException' occurred in Ippodrom.exe

Additional information: Index was outside the bounds of the array.

我该怎么办?

UPD:我需要更改已创建的图片框中的图片,而不是创建新的图片框。

3 个答案:

答案 0 :(得分:2)

您需要在表单上循环显示现有的图片框。

此过程假定您在表单上有图片框而不是在另一个容器中,例如面板。如果是这样,请相应地调整此代码:

foreach (PictureBox pb in this.Controls.OfType<PictureBox>()) {
  pb.Image = global::Ippodrom.Properties.Resources.horse;
}

答案 1 :(得分:0)

你想要的是创建一个10个PictureBox的数组并初始化它们。

您所做的是创建10个大小为N的数组,其中N为[1..10]

首先创建一个数组:

PictureBox[] pb = new PictureBox[10];

现在你有一个包含10个PixtureBox引用的数组。它们中的每一个都保持值'null'。

for (int i = 0; i < 10; i++) // C# arrays are zero-indexed, not one
{
    // Create a new PictureBox and assign it to the array
    pb[i] = new PictureBox();

    // Assign an image to this new PictureBox
    pb[i].Image = global::Ippodrom.Properties.Resources.horse;
}

发生IndexOutOfRangeException是因为你使用了一个基于索引的索引而不是零,但代码开头有缺陷,所以它不相关。

答案 2 :(得分:0)

如果您创建PictureBox数组,则不会创建任何实例。您只需声明“space”来保存对实例的引用。

我猜你要做的就是这个(但我可能错了)

PictureBox[] pb = new PictureBox[10]; // creates space for 10 elements, first one is 0
for(int i = 0; i < 10; i++) { // from 0..9 
    pb[i] = new PictureBox(); // we create the actual thing
    pb[i].Image = global::Ippodrom.Properties.Resources.horse;
}

在这里使用List可能要容易得多

IList<PictureBox> pb = new List<PictureBox>();
for(int i = 0; i < 10; i++) { // if you want exactly 10
    var theBox = new PictureBox();
    theBox.Image = global::Ippodrom.Properties.Resources.horse;
    pb.add(theBox);
}

如果你想改变它们

IList<PictureBox> pb = new List<PictureBox>() { pictureBox1 /* etc */ };
foreach(PictureBox p in pb) {
    p.Image = global::Ippodrom.Properties.Resources.horse;
}

如果您希望Control中的每个Picturebox都使用by LarsTech :)