如何通过迭代其父控件面板来获得控件的值
本文关键字:控件 何通过 迭代 | 更新日期: 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;
您可以对任何其他控制执行相同操作