1

我有许多PictureBox名称为picturebox_D1、picturebox_D2 ... D30 的es。

我想做的是改变那些PictureBoxes中的图像,但在循环中。像这样的东西,但工作

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

我该怎么做?

4

6 回答 6

2

您可以使用父容器控件的索引来按名称获取控件。例如:如果您的图片框直接放在表单上(即,不在 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”字符串就毫无意义,并且对编译器毫无意义。

于 2012-06-07T14:42:18.817 回答
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");
}
于 2012-06-07T14:40:04.330 回答
0

最好的方法是创建一个PictureBox数组并用你的图片框填充它,如下所示:

PictureBox[] pictures = {picturebox_D1, picturebox_D2, ...};

然后你可以遍历它们

foreach(var p in pictures)
{
    p.Image = new Bitmap(@"Pictures\\green.png");
}
于 2012-06-07T14:40:48.900 回答
0

在您的构造函数中创建并设置一个本地Dictionary<string, PictureBox>. 请记住,Forms 是类,就像任何其他 C# 类一样,应该这样对待。

代替for,您现在可以使用foreach和访问.Keyand.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);
}
于 2012-06-07T14:42:01.083 回答
0

非常简单的解决方案:

PictureBox mybox = (PictureBox)this.Controls.Find("pictureBox2", true)[0];
于 2012-06-07T14:44:17.887 回答
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调用之后),并且您可以在表单的剩余生命周期中重用此集合。这也确保了如果您添加任何额外的图片框(遵循相同的命名约定),您不需要更改任何内容。

于 2012-06-07T15:00:21.670 回答