[英]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
命名为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
{
...
}
}
}
您的问题是按名称订购控件。 您需要以字母排序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.