如何在使用foreach语句循环控制winform时更改循环的顺序

时间:2011-11-29 07:00:18

标签: c# winforms foreach

我正在使用Foreach循环赢取表单中的所有控件。但是,Foreach始终按字母顺序排列控件。

我尝试设置标签索引并更改控件的顺序'码。但是,循环仍按字母顺序排列。

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

2 个答案:

答案 0 :(得分:4)

使用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;

答案 1 :(得分:0)

foreach通过控件列表进行迭代。这是“未分类”,因此您需要对其进行排序。

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

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

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