2011-06-23 44 views
1

我動態填充一個ControlPanel控制一些控制迭代得到控制的價值......有些是下拉菜單中,有些是文本框:我如何通過其母公司ControlPanel控制

//inputArray is a JsonArray (thus the SelectToken methods) 

foreach (var item in inputArray) 
{ 
    //Create Label 
    Label LabelTitle = new Label(); 
    LabelTitle.Text = (string)item.SelectToken("title"); 
    Panel_Controls.Controls.Add(LabelTitle); 

    //Create Control 
    if ((string)item.SelectToken("type") == "textinput") 
    { 
     TextBox TextBox_Control = new TextBox(); 
     TextBox_Control.ID = (string)item.SelectToken("title"); 
     Panel_Controls.Controls.Add(TextBox_Control); 
    } 
    if ((string)item.SelectToken("type") == "dropdown") 
    { 
     DropDownList DropDown_Control = new DropDownList(); 
     DropDown_Control.DataSource = dropDownData; 
     DropDown_Control.DataBind(); 
     Panel_Controls.Controls.Add(DropDown_Control); 
    } 
} 

後來,我需要獲取DropDown和Text框的值。我可以過濾出標籤和其他控件。我無法弄清楚如何在foreach語句中獲取控件的值。我猜我需要將控件強制轉換爲讓我獲得.Value屬性的控件,因爲通用控件不會給我一個.Value屬性。

foreach (Control item in Panel_Controls.Controls) 
{ 
    if (!(item is Label | item is LiteralControl)) 
    { 
     //How can I access the .Value of the controls here? 
    } 
} 

有人可能會建議從TextBox和DropDown在foreach循環內獲取值的好方法嗎?

非常感謝。

回答

2

您必須將項目轉換爲相應的控件類型才能訪問它的屬性。

if (!(item is Label | item is LiteralControl)) 
{ 
     if(item is TextBox) 
     { 
     TextBox textBox = (TextBox)item; 
     string textValue = textBox.Text; 
     } 
     ... 

} 
+0

+1簡單和直接 –

+0

很好的工作,非常感謝! –

0

你應該投項目的文本框,如:

TextBox textbox = item as TextBox; 
if (textbox != null) 
    string text = textbox.Text; 

您可以爲任何其他控件做同樣的

+0

-1你必須檢查鑄造之前的類型,否則你將得到一個錯誤時,不會是一個TextBox的東西 –

+0

@Adrian - 從技術上講,這是不正確的,當使用'as'鑄造...它只會返回一個null值如果演員失敗。因此,該錯誤將是下一行中的NullReferenceException。 –

+0

你是對的@菲利普。我會刪除downvote一次@peer調整他的代碼以檢查是否爲空 –

1

或者,你可以使用LINQ來獲得文本框的IEnumerable和DropDownLists的IEnumerable

IEnumerable<TextBox> txts = Panel_Controls.Controls.OfType<TextBox>(); 
IEnumerable<DropDownList> ddls = Panel_Controls.Controls.OfType<DropDownList>(); 

結果枚舉類型已經有了正確的類型。這樣,您可以逐個遍歷枚舉類型,因爲您對每個項目所做的操作都不相同,具體取決於類型。

最終的結果是,你不會有一個IF布赫你循環中:您將有兩個迭代塊:

foreach(TextBox txt in txts) 
{ 
    //your textbox code 
} 

foreach(DropDownList ddl in ddls) 
{ 
    //your dropdownlist code 
} 
0

你不能使用控件的Text屬性?這樣你就不必關心它是什麼類型的控制。你需要什麼類型的價值?字符串會幹什麼?

foreach (Control item in Panel_Controls.Controls) 
{ 
    string value = item.Text; 
    // do something with the value 
}