Оператор foreach не может работать с переменными типа 'System.Windows.Controls.GroupBox' - PullRequest
0 голосов
/ 02 августа 2011

оператор 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 Ответ

5 голосов
/ 02 августа 2011

Ваш первый фрагмент даже не скомпилируется (при условии, что groupBox1 действительно GroupBox), так как GroupBox не имеет свойства Children.

A 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.

Это нехорошо для вас, потому что вам нужно заглянуть в дочерние элементы элемента управления и найти все текстовые поля.

В этом случае вам лучше использовать одну из многих рекурсивных реализаций "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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...