按顺序循环父控件

时间:2013-09-18 12:03:14

标签: c# winforms user-controls controls

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

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

我想循环按照它在Picturebox1上首先循环直到picturebox24的顺序循环,谢谢并有美好的一天

3 个答案:

答案 0 :(得分:0)

您可以在此处使用LINQ,假设您将图片框命名为picture1picture2,...

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;
}