foreach语句不能对类型的变量进行操作 'System.Windows.Controls.GroupBox'因为 'System.Windows.Controls.GroupBox'不包含公共 'GetEnumerator'的定义
mycode:
foreach (var txt in this.groupBox1.Children)
{
if (txt is TextBox)
{
(txt as TextBox).Text = string.Empty;
}
}
但为什么Grid的代码正确?
foreach (var txt in this.MyGrid.Children)
{
if (txt is TextBox)
{
(txt as TextBox).Text = string.Empty;
}
}
groupBox的正确代码是什么?
/////////////////的编辑
正确的代码:
foreach (var txt in this.MyGridInGroupBox.Children)
{
if (txt is TextBox)
{
(txt as TextBox).Text = string.Empty;
}
}
答案 0 :(得分:5)
您的第一个代码段甚至无法编译(假设groupBox1
确实是GroupBox
),因为GroupBox
没有Children
属性。
GroupBox
只能包含一个子项,由Content
属性表示。
如果您需要迭代GroupBox
的所有视觉子项,您可以使用VisualTreeHelper
类。像这样:
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(groupBox1); i++)
{
var txt = VisualTreeHelper.GetChild(groupBox1, i);
if (txt is TextBox) ...
}
<强>更新强>
好的,你说这不起作用,我想我理解为什么。
VisualTreeHelper
只会找到GroupBox
的第一级视觉子项,其中(实施控件时)为Grid
。
这对你没有好处,因为你需要递归到控件的子节点并找到所有的TextBox。
在这种情况下,最好在网络上使用众多recursve“FindChildren”实现之一。这是我的一个:
public static class DependencyObjectExtensions
{
public static IEnumerable<T> GetVisualChildren<T>(this DependencyObject depObj)
where T : DependencyObject
{
if (depObj == null) yield break;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);
var t = child as T;
if (t != null) yield return t;
foreach (var item in GetVisualChildren<T>(child))
{
yield return item;
}
}
}
}
你可以这样使用:
foreach (var txt in groupBox1.GetVisualChildren<TextBox>())
{
txt.Text = String.Empty;
}