0

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

    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:我需要更改创建的图片框中的图片,而不是创建新的图片框。

4

3 回答 3

2

您需要遍历表单上现有的图片框。

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

foreach (PictureBox pb in this.Controls.OfType<PictureBox>()) {
  pb.Image = global::Ippodrom.Properties.Resources.horse;
}
于 2012-04-11T18:00:03.480 回答
0

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

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

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;
}

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

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;
}

如果您希望控件中的每个图片框都使用 LarsTech :)

于 2012-04-11T17:45:03.077 回答
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 是因为您使用了从一开始的索引而不是零,但代码一开始就有缺陷,因此不相关。

于 2012-04-11T17:38:44.590 回答