我正在使用Foreach循环赢取表单中的所有控件。但是,Foreach始终按字母顺序排列控件。
我尝试设置标签索引并更改控件的顺序'码。但是,循环仍按字母顺序排列。
是否有一些方法可以在具有特定顺序的winform中循环控件?
答案 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();
}