图片框的名称

时间:2012-06-07 14:37:49

标签: c# winforms

我有很多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");
}

我该怎么做?

6 个答案:

答案 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)

我不得不在前一段时间处理类似情况,其中我有变量名var1var2,......

我能找到绕过怪物开关盒的最佳方法是使用反射。给定图片框的名称,您可以使用反射轻松找到变量本身。 这应该有效:

// 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(遵循相同的命名约定),您不需要更改任何内容。