2013-09-10 125 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包含的對象的集合。