Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# picturebox的名称_C#_Winforms - Fatal编程技术网

C# picturebox的名称

C# picturebox的名称,c#,winforms,C#,Winforms,我有许多名为PictureBox\u D1、PictureBox\u D2的PictureBoxE。。。D30 我想做的是更改那些PictureBoxes中的图像,但是在循环中。像这样的,但很有效 for (int i = 0; i < 30; i++) { if (ReceivedDataTextBox.Text[i].ToString()=="1") "pictureBox_D"+i.Image= new Bitmap

我有许多名为PictureBox\u D1、PictureBox\u D2的
PictureBox
E。。。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");
}
for(int i=0;i<30;i++)
{                     
如果(ReceivedDataExtBox.Text[i].ToString()=“1”)
“pictureBox_D”+i.Image=新位图(@“Pictures\\green.png”);
其他的
“pictureBox_D”+i.Image=新位图(@“Pictures\\red.png”);
}

我该怎么做呢?

不久前,我不得不处理一个类似的情况,在那里我有变量名
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");
}
//假设它位于图片框所在的表单内
对于(int i=0;i<30;i++){
FieldInfo field=GetType().GetField(“pictureBox_D”+i,标志);
PictureBox PictureBox=(PictureBox)字段.GetValue(this);
如果(ReceivedDataExtBox.Text[i].ToString()=“1”)
pictureBox.Image=新位图(@“Pictures\\green.png”);
其他的
pictureBox.Image=新位图(@“Pictures\\red.png”);
}

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

PictureBox[] pictures = {picturebox_D1, picturebox_D2, ...};
然后你可以迭代它们

foreach(var p in pictures)
{
    p.Image = new Bitmap(@"Pictures\\green.png");
}

在构造函数中创建并设置本地
词典
。记住,表单和其他C#类一样都是类,应该这样对待

您现在可以使用
foreach
并访问
.Key
.Value
来获取文件名和
PictureBox
对象,而不是
for
。然而,这仅仅是因为
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
        }
    }
}

可以使用父容器控件的索引按名称获取控件。例如:如果您的PictureBox直接放在表单上(即,不在面板、GroupBox或其他容器中):

for(int i=0;i<30;i++)
{
((PictureBox)this.Controls[“PictureBox_D”+i.ToString())。Image=新位图(@“Pictures\\green.png”);
}
对于嵌套的PictureBox(即GroupBox或Panel中的PictureBox),只需采用相同的方法,但在父容器上:

for(int i = 0; i < 30; i++)
{
    ((PictureBox)this.Controls["pictureBox_D" + i.ToString()]).Image = new Bitmap(@"Pictures\\green.png");
}
for(int i = 0; i < 30; i++)
{
    ((PictureBox)this.panel1.Controls["pictureBox_D" + i.ToString()]).Image = new Bitmap(@"Pictures\\green.png");
}
for(int i=0;i<30;i++)
{
((PictureBox)this.panel1.Controls[“PictureBox_D”+i.ToString())。Image=新位图(@“Pictures\\green.png”);
}
从表面上看,只要输入字符串,就可以引用变量,这似乎是合乎逻辑的,但一旦你开始深入研究C,你就会意识到这并不是C中的工作原理。编写到IDE中的代码是编译的,在编译过程中,高级代码(变量名、函数名等)的所有优点都消失了;一旦代码被编译,您的“pictureBox_D”字符串就毫无意义,对编译器来说毫无意义。

非常简单的解决方案:

PictureBox mybox = (PictureBox)this.Controls.Find("pictureBox2", true)[0];

您可以将
控件.OfType()
与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]
}
var picbox=this.Controls
第()类
.Where(pb=>pb.Name.StartsWith(“pictureBox\u D”))
.ToDictionary(pb=>int.Parse(pb.Name.Replace(“pictureBox_D”,string.Empty));
对于(int i=0;i

很好的一点是,您可以在构造函数中执行一次(在调用
InitializeComponent
之后),并且您可以在表单的剩余生命周期中重用此集合。这也确保了,如果您添加任何其他picturebox(遵循相同的命名约定),您不需要更改任何内容。

OP在问题的第一行中指出,picturebox的名称是正确的,假设问题的参数是“我有许多picturebox,名称为picturebox_D1,picturebox_D2…D30。”,我认为这些都是变量名,而不是图片框名,它特别写着“带名称”,现在它已经被标记为答案,所以我想我正确地解释了这个问题,耸耸肩
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]
}