2013-09-10 139 views
0

我在Windows窗体中有一个面板,我想将其他控件(如文本框)添加到面板中,并遍历面板中的所有元素以检索其中的所有数据。带窗口的Windows窗体控件

这可能与面板控制有关吗?

我有一个foreach循环试验如

foreach(textbox tb in panel1) 
{ 
} 

,但我得到一个错误说面板不具备的GetEnumerator一个公共定义。

什么是更好的控件/容器使用,我可以在其中添加更多的控件,并最终访问其中的所有控件的数据?


更新 只是抬起头来 - 我有一些问题,在代码中添加多个文本框。 我创建一个文本框对象,然后将其添加到面板,但只有一个出现。 我已阅读本网站的其他地方以及其他人添加具有相同名称的文本框可能导致此问题。

为了解决这个问题,我用一个效果很好的流布局面板替换了面板。 希望这可以帮助别人。

+1

确保您的数据结构(本例中为panel1)能够生成迭代器。 – JNYRanger

回答

2

这是使用正确的控件。尝试迭代面板对象的Controls属性。

foreach(Control control in panel.Controls) 
{ 
    if(control is TextBox) 
    { 
     TextBox textBox = control as TextBox; 
     //etc. 
    } 
} 
1

像这样的事情

foreach (Control c in panel1.Controls) 
{ 
    if(c.GetType() == typeof(TextBox)) 
    { 
    //do stuff 
    } 
} 
+0

请注意,在这种情况下,如果有一个从'TextBox'继承的控件,但不是'Textbox',它将不会被处理。如果你想处理这些项目,那么使用'IsAssignableFrom',或者更好的办法就是使用'Controls'集合中的'OfType'。 – Servy

+0

这将'c是TextBox'以及不会吗? – paqogomez

+0

不,它不会。如果一个类型扩展了'TextBox',那么'someDerivedType是TextBox'返回true。 – Servy

2

您需要访问小组的控件集合,如果你做的更好:

foreach(Textbox tb in panel1.Controls.OfType<TextBox>) 

但上述会给你在面板内部文本框,不在面板内的其他控件内,如果要递归获取文本框,请参见this question

2

下面的例子,只要你想清楚清除所有文本框在任何控制

void ClearTextBoxes(Control parent) 
{ 
    foreach (Control child in parent.Controls) 
    { 
     TextBox textBox = child as TextBox; 
     if (textBox == null) 
      ClearTextBoxes(child); 
     else 
      textBox.Text = string.Empty; 
    } 
} 

然后。您致电

ClearTextBoxes(panel1); 
1

您错过了一件小事。尝试:

foreach (Control c in panel1.Controls) 

然后检查控制类型,如果您有多种类型的控件。

错误的原因是panel1是一个对象,而不是对象的集合,因此您必须专门引用panel1包含的对象的集合。