Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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# 在for循环中重复使用对象名称?_C#_Winforms - Fatal编程技术网

C# 在for循环中重复使用对象名称?

C# 在for循环中重复使用对象名称?,c#,winforms,C#,Winforms,对,在Windows窗体中,我创建了一个由100个图片框组成的网格。单击图片框后,它将变为绿色,如果再次单击,它将变回初始颜色 为了保存这些,我将每个图片框状态放入bool[100]数组中。这些将使用序列化保存在XML中。(绿色为true,白色为false(默认)) 加载时,我需要使用bool数组并定义每个picturebox的状态。图片框的名称为pictureBox1、pictureBox2、pictureBox3等。 有没有方便的方法 也许你可以这样更好地理解我: for (int i =

对,在Windows窗体中,我创建了一个由100个图片框组成的网格。单击图片框后,它将变为绿色,如果再次单击,它将变回初始颜色

为了保存这些,我将每个图片框状态放入bool[100]数组中。这些将使用序列化保存在XML中。(绿色为true,白色为false(默认))

加载时,我需要使用bool数组并定义每个picturebox的状态。图片框的名称为pictureBox1、pictureBox2、pictureBox3等。 有没有方便的方法

也许你可以这样更好地理解我:

for (int i = 0; i < 100; i++) {
    if (pictureBoxes[i] == true) //pictureBoxes[] is the bool[] loaded
    { 
       **pictureBox+i**  .BackColor== System.Drawing.Color.LawnGreen; 
    } 
    else if (pictureBoxes[i] == false)
    {
         //System.Drawing.Color.White;
    }
}
for(int i=0;i<100;i++){
if(pictureBoxes[i]==true)//pictureBoxes[]是加载的bool[]
{ 
**pictureBox+i**.BackColor==System.Drawing.Color.LawnGreen;
} 
else if(pictureBoxes[i]==false)
{
//System.Drawing.Color.White;
}
}
这个例子不起作用;请帮忙?

这种方法实际上比其他方法更安全,因为我相信如果控件不存在,就会抛出错误。此方法检查以确保窗体上存在控件:

var controls = this.Controls.Find("pictureBox"+i, true);
if (controls.Length > 0)
{
    foreach (var control in controls)
    {
        control.BackColor = Color.LawnGreen;
    }
}

好的,您的问题的直接答案是在图片框的父控件上使用
控件上的属性(a)

假设您的代码正在父级(可能是表单)的实例方法中运行,您可以执行以下操作:

// Cast to PictureBox if you need to set a picture-box-specific property.
Controls["pictureBox" + i].BackColor = Color.LawnGreen;
parentControl.Controls["pictureBox" + i].BackColor = Color.LawnGreen;
一般来说,您可以执行以下操作:

// Cast to PictureBox if you need to set a picture-box-specific property.
Controls["pictureBox" + i].BackColor = Color.LawnGreen;
parentControl.Controls["pictureBox" + i].BackColor = Color.LawnGreen;

但是,首先,你是如何进入这样一种奇怪的情况的:你有一个
bool
数组,每个成员通过某种命名约定与特定的图片框相关联?如果您通过设计器“手动”将100个图片框拖到表单上,可能会让自己感到不必要的头痛。有可能设计得更好;有了更多信息,我们可能会为您提供更清洁的解决方案。

只是一个建议,不确定它是否有帮助(甚至有效) 创建从PictureBox类派生的新类,并通过添加布尔变量对其进行扩展。在构造函数中,将布尔值作为参数传递,并根据它更改背景颜色。
不要忘记将这个新类标记为[Serializable]

您不应该使用设计器创建图片框,而是在表单的构造函数(或加载事件)中使用for循环。然后,您可以将它们全部存储在图片框数组中,并像
PictureBoxControl[i]
一样访问它。为什么不直接使用背景颜色作为“布尔值”?例如,
if(picturebox[i].BackColor==System.Drawing.Color.LawnGreen){
(有关如何实际获取对象,请参见答案。)我希望你计划详细说明。它是链接的,不需要详细说明,对吗?链接的页面解释了它。@Josh M.-如果OP想要的只是一个链接,他们可以去谷歌。StackOverflow最大的好处之一是它能让你彻底、完整地回答一个特定的问题。在我看来,发布一个链接是两者兼而有之懒惰,与我们目前的做法背道而驰。另外,举个例子,如果Microsoft明天将此页面移动到另一个URL,而其他人试图找到同一问题的答案。那么这个答案绝对没有帮助。修复它所需要的只是:尝试
Controls.find(“pictureBox”+i).BackColor=Color.LawnGreen;
Controls.Find()需要2个参数。第二个参数是布尔值。无论是真是假,它仍然找不到我的pictureBox控件。谢谢你的回答。我仍然是c#的初学者。我正在尝试制作一个影院系统,用户可以选择座位。座位由图片框表示。如果拍摄,它将变为绿色,如果不是白色。是的,我手动完成了拖动100个文本框。@user669910:干杯。贾斯汀的评论是一个很好的起点。:)当
控制[“pictureBox”+i]时会发生什么
不存在?它不会抛出错误吗?@Martin:如果同名控件不存在,索引器返回
null
。由于OP有一个布尔数组,其中每个成员都与一个控件隐式关联,因此这种情况将代表OP程序逻辑中其他地方的错误。