在for循环中重用Object Names?

时间:2011-03-21 18:16:19

标签: c# winforms

是的,在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;
    }
}

此示例不起作用;请帮帮忙?

3 个答案:

答案 0 :(得分:4)

嗯,您问题的直接答案是在图片框的父控件上使用Controls属性indexer by nameControlCollection)。

假设您的代码在父代的实例方法(可能是表单)中运行,您可以这样做:

// 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;

但是你是如何进入一个奇怪的情况,你有一个bools数组,每个成员通过一些命名约定与一个特定的图片框相关联?如果您通过设计师“手动”将100个图片框拖到表格上,您可能会给自己带来不必要的麻烦。它可能设计得更好;通过更多信息,我们可以为您提供更清洁的解决方案。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

Controls.Find()

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

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