【问题标题】:Enumerating Controls on a Form枚举窗体上的控件
【发布时间】:2014-07-17 22:15:27
【问题描述】:

我有一个包含大约 30 个控件的表单,当用户单击一个按钮时,每个控件的数据都会保存到一个文件中。但是我需要遍历表单上的每一个控件(我可以这样做),但它需要按顺序排列,例如,我需要从表单的左上角开始,一直到底部表格右侧。

这就是 foreach 循环的工作方式吗?即:

foreach(Control control in this.Controls)
{
}

还是没有按顺序通过它们?

【问题讨论】:

  • 您是否还需要枚举控件的子控件?
  • 嗯,不。 Atm 我只有按钮、标签、链接标签、文本框和一些复选框。但是,如果我将来添加一个面板或拆分容器,那就太好了

标签: c# .net winforms foreach enumeration


【解决方案1】:

这将按照它们添加到表单的顺序返回控件,而不是按视觉顺序。

如果您已按照与解析控件相同的顺序设置TabIndex,则可以使用 LINQ 按TabIndex 对它们进行排序。

foreach (Control control in this.Controls.Cast<Control>().OrderBy(c => c.TabIndex))
{
}

【讨论】:

  • 哦,这太棒了。是的,我应该提到这一点,我正在使用标签索引。 :) 谢谢!!!
  • 但 TabIndex 的顺序可能与视觉外观的顺序不同
  • @Kiran;是啊,就是。在 Visual Studio 中,您可以在设计视图中单击一个工具栏按钮,该按钮使您能够简单地单击一个控件来设置其选项卡索引。 :-)
  • @Albin Sunnanbo 你能给我提供与上述代码等效的 .net 2.0 吗? Linq 在我的系统中不起作用。
【解决方案2】:

您是否还需要枚举控件的子控件?

如果不行,试试

foreach(Control control in this.Controls.Cast<Control>().OrderBy(o => o.Location.Y).ThenBy(o => o.Location.X)
{
    ...
}

这将枚举控件,从左上角开始向右移动,然后向下移动。

【讨论】:

  • 按规范!如果一行中的所有控件都完全定位在相同的Y 上,则可以正常工作。如果您将标签和文本框整齐地排列在一行中,它们的Y 就不一样了。这可能是也可能不是问题,具体取决于控件是否为混合类型。
  • 谢谢@BlueRaja - 我不知道你能做到这一点。我认为它会更加坚韧
  • @Albin:您还可以通过将o.Location.Y 替换为o.Location.Y + o.Height/2(并将o.Location.X 替换为o.Location.X + o.Width/2)来按控件的中心而不是左上角进行排序。或者,您可以使用简单的.OrderBy(o =&gt; o.Location.Y*o.Location.Y + o.Location.X*o.Location.X) 按到左上角的距离进行排序。这两者都有优点和缺点。由于控件并不总是与网格很好地对齐,因此无法以“阅读顺序”完美地枚举它们 - 如果这些建议都不起作用,OP 将需要更好地定义他希望它们如何排序。
  • @BlueRaja - Danny Pflugho 你能提供我上面代码的 .net 2.0 等价物吗? Linq 在我的系统中不起作用。
猜你喜欢
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多