Как проверить только те Textbox'ы, которые сейчас видимы в программе?

Рейтинг: 0Ответов: 3Опубликовано: 27.03.2015

Есть программа, при определенных чекбоксах пользователю отображаются только некоторые текстбоксы, существующие на форме. Как мне программно проверить, не пусты ли они, когда пользователь нажимает на кнопку считывания информации со всех visible текстбоксов?

Просто, не хочется делать в лоб - 4 проверки (так как 4 возможных появления текстбоксов на форме).

Ответы

▲ 1Принят

Если у вас версия .Net выше 3, то можете использовать такой код:

    foreach (TextBox tb in this.Controls.OfType<TextBox>())
    {
        if (tb.Visible && String.IsNullOrEmpty(x.Text))
        {
            // Код обработки
        }
    }

Если версия .Net ниже 3, то такой:

    foreach (Control cont in Controls)
    {
        if (cont is TextBox)
        {
            TextBox x = (TextBox)cont;

            if (x.Visible && String.IsNullOrEmpty(x.Text))
            {
                // Код обработки
            }
        }
    }
▲ 2

Не помню уже всех подробностей WPF (не уверен в свойствах Controls и IsVisible), но примерно так:

foreach (var textbox in rootControl.Controls.OfType<TextBox>().Where(t => t.IsVisible))
{
    // проверка на заполненность
}
▲ 2

Тебе понадобится хелпер метод:

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject d)
   where T : DependencyObject
{
    if (d != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(d); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(d, i);
            if (child != null && child is T)
            {
                yield return (T)child;
            }

            foreach (T childOfChild in FindVisualChildren<T>(child))
            {
                yield return childOfChild;
            }
        }
    }
}

и затем в форме пишешь:

var visibleTextBoxes = FindVisualChildren<TextBox>(this).Where(tb => tb.IsVisible);
foreach (var textBox in visibleTextBoxes)
{
    //проверка
}