我有很多PictureBox
es,名称为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");
}
我该怎么做?
答案 0 :(得分:2)
您可以使用父容器控件的索引来按名称获取Control。例如:如果您的图片框只是直接放在您的表单上(即,不在Panel,GroupBox或其他容器中):
for(int i = 0; i < 30; i++)
{
((PictureBox)this.Controls["pictureBox_D" + i.ToString()]).Image = new Bitmap(@"Pictures\\green.png");
}
对于嵌套的PictureBoxes(即GroupBoxes或Panels中的那些),只需采用相同的方法,但在父容器上:
for(int i = 0; i < 30; i++)
{
((PictureBox)this.panel1.Controls["pictureBox_D" + i.ToString()]).Image = new Bitmap(@"Pictures\\green.png");
}
从表面上看,通过输入字符串你应该能够引用变量似乎是合乎逻辑的,但是一旦你开始深入研究C#,你就会意识到这并不是C#中的工作原理。您编写到IDE中的代码已经过编译,在编译期间,高级代码(变量名,函数名等等)的所有优点都消失了;编译代码后,你的“pictureBox_D”字符串毫无意义,对编译器没有意义。
答案 1 :(得分:0)
我不得不在前一段时间处理类似情况,其中我有变量名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");
}
答案 2 :(得分:0)
执行此操作的最佳方法是创建一个PictureBox
数组并将其填充到您的图片框中:
PictureBox[] pictures = {picturebox_D1, picturebox_D2, ...};
然后你可以迭代它们
foreach(var p in pictures)
{
p.Image = new Bitmap(@"Pictures\\green.png");
}
答案 3 :(得分:0)
在构造函数中创建并设置本地Dictionary<string, PictureBox>
。请记住,Forms就像其他C#类一样是类,应该这样对待。
现在,您可以使用for
而不是foreach
来访问.Key
和.Value
来获取文件名和PictureBox
个对象。这只能起作用,因为你在PictureBox
名称与所需图片之间存在着如此严格的关系。如果配对发生变化,或者您希望对两个图片框使用相同的图像,则需要将其更改为List<Tuple<string, PictureBox>>
。事实上,这甚至可能是处理这种情况的最佳方式。
public class Form1 : Form
{
private Dictionary<string, PictureBox> pictureBoxes;
public Form1()
{
pictureBoxes = new Dictionary<string, PictureBox>()
{
{"Pictures\\green.png", pictureBox_D},
{"Pictures\\blue.png", pictureBox_B},
// Etcetera
}
}
}
如果要循环覆盖它们,请执行以下操作:
foreach(var kvp in pictureBoxes)
{
kvp.Value.Image = new Bitmap(kvp.Key);
}
答案 4 :(得分:0)
非常简单的解决方案:
PictureBox mybox = (PictureBox)this.Controls.Find("pictureBox2", true)[0];
答案 5 :(得分:0)
您可以使用Controls.OfType<PictureBox>()
结合LINQ来获取所需的项目。实际上,您可以将它们全部转换为可以使用的集合:
var picBoxes = this.Controls
.OfType<PictureBox>()
.Where(pb => pb.Name.StartsWith("pictureBox_D"))
.ToDictionary(pb => int.Parse(pb.Name.Replace("pictureBox_D", string.Empty)));
for(int i = 0; i < picBoxes.Length; i++)
{
// Do what you need with picBoxes[i]
}
好处是你可以在构造函数中执行一次(在调用InitializeComponent
之后),并且您可以在表单的其余部分重用此集合。这也确保了如果您添加任何其他PictureBox(遵循相同的命名约定),您不需要更改任何内容。