如何通过迭代其父控件面板来获得控件的值

本文关键字:控件 何通过 迭代 | 更新日期: 2023-09-27 18:00:25

我正在用一些控件动态填充控制面板。。。有些是DropDowns,有些是TextBoxe:

//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);
    }
}

稍后,我需要获取下拉框和文本框字段的值。我可以过滤掉标签和其他控件。我不知道如何在foreach语句中获取Controls的值。我想我需要将控件强制转换为可以获得.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获取值的好方法吗?

非常感谢。

如何通过迭代其父控件面板来获得控件的值

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

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

或者,您可以使用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
}

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

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

您应该将项目强制转换到文本框中,如:

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

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