Почему при просмотре веб-страницы в телефоне или Safari моя сетка CSS и флексбокс изображений показывают мне пустое пространство?

Когда вы вызываете Control.Controls, он возвращает только элементы управления на самом удаленном уровне. Он не будет рекурсивно спускаться в любые элементы управления контейнерами, в которых содержатся другие элементы управления.

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

В качестве альтернативы вы можете обобщить его, написав метод рекурсивного возврата всех элементов управления из родительского и всех его дочерних элементов, например:

public IEnumerable<Control> AllControls(Control container)
{
    foreach (Control control in container.Controls)
    {
        yield return control;

        foreach (var innerControl in AllControls(control))
            yield return innerControl;
    }
}

Затем вы можете использовать это вместо Control.Controls следующим образом:

private void test() // Assuming this is a member of a Form other class derived from Control
{
    var textboxesWithFilledTag = 
        AllControls(this).OfType<TextBox>()
        .Where(tb => (string) tb.Tag == "Filled");

    foreach (var textbox in textboxesWithFilledTag)
        Debug.WriteLine(textbox.Text);
}

Как говорится в комментарии, я предполагаю, что метод test() является членом вашей Формы или другого класса, производного от Control. Если это не так, вам нужно передать ему родительский элемент управления:

private void test(Control container)
{
    var textboxesWithFilledTag = 
        AllControls(container).OfType<TextBox>()
        .Where(tb => (string) tb.Tag == "Filled");

    foreach (var textbox in textboxesWithFilledTag)
        Debug.WriteLine(textbox.Text);
}

Следующий метод имеет идентичные результаты с приведенным выше, для справки (и более читаемым IMHO):

private void test(Control container)
{
    foreach (var textbox in AllControls(container).OfType<TextBox>())
        if ((string)textbox.Tag == "Filled")
            Debug.WriteLine(textbox.Text);
}

Для вашего кода обработчик щелчка на кнопке может выглядеть примерно так:

void button1_Click(object sender, EventArgs e)
{
    foreach (var c in AllControls(this).OfType<TextBox>())
    {
        if ((string) c.Tag == "Filled")
        {
            // Here is where you put your code to do something with Textbox 'c'
        }
    }
}

Обратите внимание, что вам также нужен метод AllControls(), конечно.

0
задан Shakespear 30 December 2018 в 22:52
поделиться