当您调用 时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()
方法是您的 Form 或从 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);
}
以下方法与上述方法具有相同的结果,以供参考(恕我直言,更具可读性):
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()
当然也需要该方法。