Когда вы вызываете 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()
, конечно.