2

我在 groupbox 上的 24 个图片框上循环显示某些东西,但它没有按正确的顺序循环,它可能从第 18 个图片框开始,这是我使用的代码

foreach (var pb in groupBox1.Controls)
{
    if (pb is PictureBox && previewIndexer < Previewer.Count)
    {
        try
        {
            ((PictureBox)pb).Image = ...
            previewIndexer++;
            ...
        }
        catch
        {
            ...
        }
    }
}

我想按升序循环,它首先在picturebox1上循环直到picturebox24,谢谢,祝你有美好的一天

4

3 回答 3

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
                {
                    ...
                }
      }
}
于 2013-09-18T12:12:10.790 回答
0

您的问题是按名称订购控件。您需要字母数字排序才能picturebox10picturebox5. 如果您将按名称中的数字对图片框进行排序,则可以这样做:

foreach (var pb in groupBox1.Controls.OfType<PictureBox>()
               .OrderBy(x => Int32.Parse(x.Name.Substring("picturebox".Length))))
{
    pb.Image = ...;
}

我什至会创建一些方法,例如(它从控件名称中删除所有非数字字符并尝试将其余部分解析为整数值):

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 = ...;
}    
于 2013-09-18T12:12:40.320 回答
0

您可以使用引用控件名称的字符串来索引 Controls 属性。这可能是最简单的解决方案:

for (int i = 1; i <= 24; i++)
{
     PictureBox pb = groupBox1.Controls["picturebox" + i.ToString()] as PictureBox;
}
于 2013-09-18T12:21:46.087 回答