我有很多PictureBox
的名字叫picturebox_D1,picturebox_D2...D30。
我想要做的是改变这些PictureBox
es中的图像,但在循环中。类似这样的东西,但工作正常
for (int i = 0; i < 30; i++)
{
if (ReceivedDataTextBox.Text[i].ToString()=="1")
"pictureBox_D"+i.Image= new Bitmap(@"Pictures\\green.png");
else
"pictureBox_D"+i.Image= new Bitmap(@"Pictures\\red.png");
}
我该怎么做呢?
发布于 2012-06-07 14:42:19
您可以对父容器的控件进行索引,以按名称获取控件。例如:如果你的图片框直接放在你的表单上(例如,不是放在面板、GroupBox或其他容器中):
for(int i = 0; i < 30; i++)
{
((PictureBox)this.Controls["pictureBox_D" + i.ToString()]).Image = new Bitmap(@"Pictures\\green.png");
}
对于嵌套的PictureBoxes (即GroupBoxes或面板中的),只需在父容器上采用相同的方法即可:
for(int i = 0; i < 30; i++)
{
((PictureBox)this.panel1.Controls["pictureBox_D" + i.ToString()]).Image = new Bitmap(@"Pictures\\green.png");
}
从表面上看,只需键入字符串就应该能够引用变量,这似乎是合乎逻辑的,但一旦开始深入研究C#,您就会意识到这不是C#中的实际工作方式。您编写到集成开发环境中的代码将被编译,在编译过程中,高级代码(变量名、函数names..etc)的所有优点都会消失;一旦编译代码,您的"pictureBox_D“字符串就没有意义了,并且对编译器没有任何意义。
发布于 2012-06-07 14:40:04
前段时间我不得不处理类似的情况,我有变量名var1
,var2
,...
我能找到的最好的解决方法就是使用反射。给定图片框的名称,您可以使用反射很容易地找到变量本身。这应该是可行的:
// Assuming this is inside the form where the pictures boxes are hosted
for (int i = 0; i < 30; i++){
FieldInfo field = GetType().GetField("pictureBox_D"+i, flags);
PictureBox pictureBox = (PictureBox)field.GetValue(this);
if (ReceivedDataTextBox.Text[i].ToString()=="1")
pictureBox.Image= new Bitmap(@"Pictures\\green.png");
else
pictureBox.Image= new Bitmap(@"Pictures\\red.png");
}
发布于 2012-06-07 14:40:49
要做到这一点,最好的方法是创建一个PictureBox
数组,并用图片框填充它,如下所示:
PictureBox[] pictures = {picturebox_D1, picturebox_D2, ...};
然后,您可以遍历它们
foreach(var p in pictures)
{
p.Image = new Bitmap(@"Pictures\\green.png");
}
https://stackoverflow.com/questions/10934013
复制相似问题