我的程序中有一些不同颜色的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-循环不会那样工作,但这是我想要做的基本想法。我已经把我所有的PictureBoxes都放进了我的列表中,在for循环中我想对它们进行计数。首先,它应该播放只要列表是长的,然后每次它转到下一个框,应该检查它的颜色,然后添加一个到单独的计数器。问题是,我每次都会收到错误,我不知道如何读取列表中每一项的BackColors值。
谢谢你也许能帮我:)
发布于 2014-07-29 12:14:33
因为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“类型的控件的数量,这些控件具有您要寻找的BackColor (再次使用LINQ )。
var counterWhite = Controls.OfType<PictureBox>()
.Count(p => p.BackColor == Color.White);
var counterGreen = Controls.OfType<PictureBox>()
.Count(p => p.BackColor == Color.Green);https://stackoverflow.com/questions/25014717
复制相似问题