当您致电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()
。
也许你没有在控件中的文本框? – dasblinkenlight 2013-05-03 14:02:38
你得到了什么错误? – 2013-05-03 14:03:59
您是否使用调试器来遍历代码?您可以检查变量的值。 – Dirk 2013-05-03 14:04:01