我的应用程序中有一个包含子控件的groupbox。(如附图中所示)。我想枚举所有文本框,使用简单的foreach循环执行一些验证。
本文件大纲将对控制的住房提供一个合理的概念
<tr ng-repeat="row in layers | filter:isActive | orderBy:row.name">
<td><input type="radio" id="{{ 'layerOption-' + row.key }}" name="layerOptions" ng-checked="row.checked" /></td>
<td>{{ row.name }}</td>
<td></td>
</tr>
我的问题是,是否有更好的方法(可能通过LINQ)获得所有控件,包括容纳在面板内的文本框而不是上述方法。
答案 0 :(得分:16)
我不知道这更好......是否更容易阅读是一个意见问题:
var validData
= grpBxTargetSensitivity.Controls.OfType<FlowLayoutPanel>()
.SelectMany(c => c.Controls.OfType<Panel>())
.SelectMany(c => c.Controls.OfType<TextBox>())
.All(textbox => !string.IsNullOrWhiteSpace(textbox.Text));
这将获取GroupBox中所有FlowLayoutPanel中所有Panel内的所有TextBox,如果所有这些TextBox中都有值,则返回true
。
答案 1 :(得分:4)
单衬里洗脱,
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
}
答案 2 :(得分:3)
我创建了一个方法,能够为你找到任何文本框(或T类型)和Textbox(或T类型)中的任何继承对象:
$(document).ready(function () {
$('table').find('a').click(function () {
var original = parseInt($(this).parents('tr').find('td:nth-child(4)').text()) + 5;
$(this).parents('tr').find('input[type=text]').val(original);
});
});
并将此表格用于例如:
public static List<T> GetSubControlsOf<T>(Control parent) where T : class
{
var myCtrls = new List<T>();
foreach (Control ctrl in parent.Controls)
{
if (ctrl.GetType() == typeof(T) || ctrl.GetType().IsInstanceOfType(typeof(T))) // if ctrl is type of T
{
myCtrls.Add(ctrl as T);
}
else if (ctrl.HasChildren)
{
var childs = GetSubControlsOf<T>(ctrl);
if (childs.Any()) myCtrls.AddRange(childs);
}
}
return myCtrls;
}
答案 3 :(得分:2)
我在StackOverflow本身找到了以下链接:
How to get ALL child controls of a Windows Forms form of a specific type (Button/Textbox)?
Loop through all the user controls on a page
给他们试试。应该适合你的情况。