我在groupbox上的24个图片框上循环显示内容,但它没有以正确的顺序循环,它可能从第18个图片框开始,这里是使用的代码
foreach (var pb in groupBox1.Controls)
{
if (pb is PictureBox && previewIndexer < Previewer.Count)
{
try
{
((PictureBox)pb).Image = ...
previewIndexer++;
...
}
catch
{
...
}
}
}
我想循环按照它在Picturebox1上首先循环直到picturebox24的顺序循环,谢谢并有美好的一天
答案 0 :(得分:0)
您可以在此处使用LINQ
,假设您将图片框命名为picture1
,picture2
,...
foreach (var pb in groupBox1.Controls.OfType<PictureBox>().OrderBy(p=>int.Parse(Regex.Replace(k,"\\D*",""))))
{
if(previewIndexer < Previewer.Count) {
try
{
((PictureBox)pb).Image = ...
previewIndexer++;
...
}
catch
{
...
}
}
}
答案 1 :(得分:0)
您的问题是按名称排序控件。您需要进行字母数字排序才能picturebox10
追踪picturebox5
。如果您按名称中的数字对图片框进行排序,则可以执行此操作:
foreach (var pb in groupBox1.Controls.OfType<PictureBox>()
.OrderBy(x => Int32.Parse(x.Name.Substring("picturebox".Length))))
{
pb.Image = ...;
}
我甚至会创建一些方法(它从控件名中删除所有非数字字符并尝试将rest解析为整数值):
private int GetControlId(Control control)
{
int id;
string idToParse = Regex.Replace(control.Name, @"\D+", "");
return Int32.TryParse(idToParse, out id) ? id : 0;
}
在查询中使用此方法
var pictureBoxes = groupBox1.Controls.OfType<PictureBox>();
foreach (var pb in pictureBoxes.OrderBy(GetControlId))
{
pb.Image = ...;
}
答案 2 :(得分:0)
您可以使用引用控件名称的字符串索引Controls属性。 这可能是最简单的解决方案:
for (int i = 1; i <= 24; i++)
{
PictureBox pb = groupBox1.Controls["picturebox" + i.ToString()] as PictureBox;
}