Получить список элементов управления Child внутри группового ящика
У меня есть групповой ящик в моем приложении, который содержит дочерние элементы управления. (Как видно на рисунке прикрепленного файла). Я хочу перечислить все текстовые поля для выполнения некоторой проверки, используя простой цикл foreach.
В этом документе будет дано четкое представление о жилье органов управления.
![enter image description here]()
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);
}
}
}
}
}
}
Мой вопрос: есть ли лучший способ (возможно, через LINQ) получить все элементы управления, включая текстовые поля, размещенные внутри панелей, чем вышеупомянутый метод.?
Ответы
Ответ 1
Я не знаю, что это лучше. Легче читать, это вопрос мнения:
var validData
= grpBxTargetSensitivity.Controls.OfType<FlowLayoutPanel>()
.SelectMany(c => c.Controls.OfType<Panel>())
.SelectMany(c => c.Controls.OfType<TextBox>())
.All(textbox => !string.IsNullOrWhiteSpace(textbox.Text));
Это захватит все текстовые поля внутри всех панелей во всех FlowLayoutPanels в GroupBox и вернет true
, если все те TextBoxes имеют в них значение.
Ответ 2
Один слот оболочки,
IEnumerable<TextBox> collection = grpBxTargetSensitivity.Children.OfType<TextBox>(); //assuming you are looking for TextBox
или
Вы можете попробовать выполнить общий метод,
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;
}
}
}
}
затем перечислите элементы управления следующим образом:
foreach (TextBox tb in FindVisualChildren<TextBox>(grpBxTargetSensitivity)) //assuming you are looking for TextBox
{
// do something
}
Ответ 3
Я создаю один метод, благодаря возможности найти для вас любые элементы управления (или тип T) и любой унаследованный объект из элемента управления (или тип T):
public static List<T> GetSubControlsOf<T>(Control parent) where T : Control
{
var myCtrls = new List<T>();
foreach (Control ctrl in parent.Controls)
{
// if ctrl is type of T
if (ctrl.GetType() == typeof(T) ||
ctrl.GetType().IsInstanceOfType(typeof(T)))
{
myCtrls.Add(ctrl as T);
}
else if (ctrl.HasChildren)
{
var childs = GetSubControlsOf<T>(ctrl);
if (childs.Any())
myCtrls.AddRange(childs);
}
}
return myCtrls;
}
и используйте эту форму для:
foreach (var textbox in GetSubControlsOf<TextBox>(this))
{
validData &= !string.IsNullOrWhiteSpace(textbox.Text);
}
Ответ 4
Я нашел следующие ссылки на StackOverflow:
Как получить ВСЕ дочерние элементы формы формы Windows Forms определенного типа (Button/Textbox)?
Прокрутите все пользовательские элементы управления на странице
Дайте им попробовать. Должен работать в вашем случае.