我发现了this问题,但它与XML文件一起使用,所以我不太了解发生了什么。
我想要做的是获取我的for循环中填充的对象列表。现在我有这个:
for (int i = 0; i < dogs.Length; i++)
{
dogs[i] = new Dog();
}
dogs[0].PictureBox = picDog0;
dogs[1].PictureBox = picDog1;
dogs[2].PictureBox = picDog2;
dogs[3].PictureBox = picDog3;
我想做这样的事情:
for (int i = 0; i < dogs.Length; i++)
{
dogs[i] = new Dog();
dogs[i].PictureBox = StringToVariable("picDog" + i);
}
PictureBox
是一个属性字段,以防万一。
StringToVariable()是我不了解的事情。我甚至不知道要搜索它会被叫什么。
答案 0 :(得分:2)
没有a good, minimal, complete code example,我们无法肯定地说。但我希望以下陈述适用于您的场景:
dogs[i].PictureBox = (PictureBox)Controls.Find("picDog" + i, true)[0];
那将依次为每个控件搜索当前控件的子节点(我假设在这种情况下是你的Form
子类)。这有点低效,因为它必须搜索每个项目的控件集合,但只要您的项目数量相对较少,这可能不是问题。
根据Form
的设置方式,以下内容也可能有效:
string prefix = "picDog";
foreach (PictureBox pictureBox in Controls.OfType<PictureBox>())
{
if (pictureBox.Name.StartsWith(prefix))
{
int index;
if (int.TryParse(pictureBox.Name.Substring(prefix.Length), out index))
{
dogs[index] = pictureBox;
}
}
}
该版本只检查每个子控件一次,尝试解析附加到"picDog"
初始文本的索引,如果成功,则使用该索引直接分配给您的数组。这样做的好处是可以很好地扩展到更大的控件列表,但在你的情况下可能有点过分。
请注意,在上述两个示例中,我都遗漏了任何错误检查。在任何一个示例中,您可能希望添加某种处理以防万一(对于第一个示例)无法找到所需的控件,或者(对于第二个示例)如果找到无法解析的控件索引,或者无法填写dogs
数组的其中一个元素。
如果由于某些原因上述示例似乎都不适合您,请编辑您的帖子,以便它包含更好的代码示例。
答案 1 :(得分:1)
有时一个简单的解决方案可以很好地运作。怎么样?
var picDogs = new [] { picDog0, picDog1, picDog2, picDog3 };
for (int i = 0; i < dogs.Length; i++)
{
dogs[i] = new Dog();
dogs[i].PictureBox = picDogs[i];
}
你甚至可以这样做:
var dogs = new [] { picDog0, picDog1, picDog2, picDog3 }
.Select(picDog => new Dog() { PictureBox = picDog })
.ToArray();