如何通过迭代其父ControlPanel来获取控件的值

时间:2011-06-23 14:52:19

标签: c# .net foreach controlpanel

我用一些控件动态填充ControlPanel ......有些是DropDowns,有些是TextBoxes:

//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框字段的值。我可以过滤掉Label和其他控件。我无法弄清楚如何在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?
    }
}

有人可以建议在foreach循环中从TextBox和DropDowns获取值的好方法吗?

非常感谢。

4 个答案:

答案 0 :(得分:2)

您必须将项目转换为适当的控件类型才能访问它的属性。

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

}

答案 1 :(得分:1)

或者,您可以使用Linq获取IEnumerable个文本框和IEnumerable DropDownLists:

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

结果枚举已经具有正确的类型。这样你就可以单独遍历枚举,因为你对每个项目的处理方式不同,具体取决于类型。

最终结果是你在循环中没有IF的buch:你将有两个迭代块:

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

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

答案 2 :(得分:0)

您应该将项目转换为文本框,如:

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

您可以对任何其他控件执行相同操作

答案 3 :(得分:0)

你不能使用控件的Text属性吗?这样你就不必关心它是什么类型的控制。你需要什么类型的价值?字符串会吗?

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