将listBox中的一个PictureBox转换回一个PictureBox

本文关键字:一个 PictureBox 转换 listBox | 更新日期: 2023-09-27 18:15:29

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

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循环中对它们进行计数。首先,只要列表很长,它就应该播放,然后每次它去到下一个框,应该检查它的颜色,然后添加一个1到单独的计数器。问题是我每次都得到错误,我不知道如何读取每个项目的BackColors在我的列表中的值。

谢谢你的帮助:)

将listBox中的一个PictureBox转换回一个PictureBox

你得到一个错误,因为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>来存储引用,这样在遍历集合时就不需要强制类型转换了。

或者更好的是(也是我选择的),只是查询窗体上的控件,并计算具有您正在寻找的背景颜色的"PictureBox"类型的控件的数量(再次使用LINQ)。

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