如何在使用foreach语句循环窗体控件时更改循环的顺序

本文关键字:循环 控件 顺序 窗体 foreach 语句 | 更新日期: 2023-09-27 18:15:57

我使用Foreach循环所有控件在一个双赢的形式。但是,Foreach总是按字母顺序排列控件。

我尝试设置选项卡索引,并更改控件代码的顺序。然而,循环仍然是按字母顺序排列的。

是否有一些方法在窗体中以特定的顺序循环控件?

如何在使用foreach语句循环窗体控件时更改循环的顺序

使用LINQ扩展方法.OrderBy()(及其同伴.OrderByDescending()),您可以使用任何您想要的排序。

但是由于Controls是一个非泛型集合,您需要首先将其转换为泛型变体。这可以用.OfType<T>()(过滤器)或.Cast<T>()(强制转换)来完成。

foreach (var c in Controls.OfType<Control>().OrderBy(c => c.Size.Top))
{
    // ...
}

如果您需要在运行时修改集合,您可以使用.ToList()创建快照。

foreach (var c in Controls.OfType<Control>().OrderBy(c => c.Size.Top).ToList())
{
    // ...
}

你需要导入LINQ命名空间来启用扩展方法。

using System.Linq;

foreach遍历List of Controls。这个列表是"未排序的",因此你需要对它进行排序。


如果您需要一些特定的排序,我会将列表复制到字典中,其中键是您要排序的属性。

这里有一小段伪代码,可以解释我的意思。

Dictionary<int, IControl> controls = new Dictionary<int, IControl>();
foreach(IControl control in form.Controls){
    int tabIndex = control.TabIndex;
    controls.add(tabIndex, control);
}
controls.Sort();
foreach(IKeyValuePair<int, IControl> control controls){
    control.DoSome();
}