foreach语句不能对'System.Windows.Controls.GroupBox'类型的变量进行操作

时间:2011-08-01 23:20:41

标签: wpf c#-4.0 foreach

  

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;
        }
    }

1 个答案:

答案 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;
}