繁体   English   中英

按顺序循环在父控件上

[英]looping on parent controls in order

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

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

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

您可以在此处利用LINQ ,假设您将picture1 picture2命名为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
                {
                    ...
                }
      }
}

您的问题是按名称订购控件。 您需要以字母排序picturebox10后去picturebox5 如果您将图片框按其名称中的数字排序,则可以这样做:

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

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

for (int i = 1; i <= 24; i++)
{
     PictureBox pb = groupBox1.Controls["picturebox" + i.ToString()] as PictureBox;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM