将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.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);