我的应用程序中有一个包含子控件的groupbox.(如附图中所示).我想枚举所有文本框,使用简单的foreach循环执行一些验证.
本文件大纲将对控制的住房提供一个公平的概念
foreach (Control control in grpBxTargetSensitivity.Controls)
{
if (control is FlowLayoutPanel && control.HasChildren)
{
foreach (Control ctrl in control.Controls)
{
if (ctrl is Panel && ctrl.HasChildren)
{
foreach (Control tbox in ctrl.Controls)
{
if (tbox is TextBox)
{
TextBox textbox = tbox as TextBox;
validData &= !string.IsNullOrWhiteSpace(textbox.Text);
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否有更好的方法(可能通过LINQ)获得所有控件,包括容纳在面板内的文本框,而不是上述方法.
Gra*_*ICA 18
我不知道这更好......是否更容易阅读是一个意见问题:
var validData
= grpBxTargetSensitivity.Controls.OfType<FlowLayoutPanel>()
.SelectMany(c => c.Controls.OfType<Panel>())
.SelectMany(c => c.Controls.OfType<TextBox>())
.All(textbox => !string.IsNullOrWhiteSpace(textbox.Text));
Run Code Online (Sandbox Code Playgroud)
这将抓取GroupBox中所有FlowLayoutPanel中所有Panel内的所有TextBox,true
如果所有这些TextBox都有值,则返回.
一班班轮
IEnumerable<TextBox> collection = grpBxTargetSensitivity.Children.OfType<TextBox>(); //assuming you are looking for TextBox
Run Code Online (Sandbox Code Playgroud)
要么
您可以尝试以下通用方法,
public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后按以下方式枚举控件,
foreach (TextBox tb in FindVisualChildren<TextBox>(grpBxTargetSensitivity)) //assuming you are looking for TextBox
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9299 次 |
最近记录: |