将listBox中的PictureBox转换回PictureBox

时间:2014-07-29 11:55:39

标签: c# visual-studio list listbox picturebox

我的程序中有一些不同颜色的PictureBoxes,我想数一个颜色有多少盒子。所以我创建了一个计算它的函数:

private void cmdCount(object sender, EventArgs e)
    {
        int counterWhite, counterRed, counterGreen, counterYellow, counterBlue, counterOrange = 0;

        if (alreadyAdded == false)
        {
            lstBox.Items.Add(picA1);
            lstBox.Items.Add(picA2);
            lstBox.Items.Add(picA3);
            //...

            alreadyAdded = true;
        }

        //Log
        String value = Convert.ToString(lstBox.Items.Count);
        lblLog.Text = "Objects in array: " + value;

        for(int i = 0; i < lstBox.Items.Count; i++)
        {
            if(lstBox.Items[i].BackColor == Color.White)
            {
                counterWhite += 1;
            }
            else if...


        }
    }

我知道,我的for循环不会那样工作,但它是我想要做的基本想法。 我已将所有PictureBox放入我的列表中,而在for循环中我想要计算它们。首先它应该在列表很长时播放,然后每次进入下一个框并且应该检查它的颜色然后在单独的计数器中添加一个。问题是我每次都会出错,而且我不知道如何在列表中为每个项目读出BackColors的值。

感谢您帮助我:)

1 个答案:

答案 0 :(得分:1)

你收到一个错误,因为ListBox.Items集合是一个ObjectCollection ......它必须是,因为它允许你存储你想要的任何对象。

在访问对象上的属性之前,您必须将对象强制转换回PictureBox

if (((PictureBox)lstBox.Items[i]).BackColor == Color.White)
{
    counterWhite += 1;
}

或者您可以切换到foreach循环并立即全部转换(使用LINQ):

foreach (var pBox in new lstBox.Items.Cast<PictureBox>())
{
    if (pBox.BackColor == Color.White)
    {
        counterWhite += 1;
    }
    ...
}

不要使用ListBox控件作为临时存储来引用PictureBox控件。您可以创建一个List<PictureBox>来存储引用,然后在迭代集合时不必进行转换。

或者更好(和我选择的那个),只需查询Form上的控件,并计算具有您正在寻找的BackColor的“PictureBox”类型的控件数量(再次使用LINQ)。 / p>

var counterWhite = Controls.OfType<PictureBox>()
                           .Count(p => p.BackColor == Color.White);

var counterGreen = Controls.OfType<PictureBox>()
                           .Count(p => p.BackColor == Color.Green);