Как я могу получить значение элемента управления путем перебора его родительской ControlPanel - PullRequest
1 голос
/ 23 июня 2011

Я динамически заполняю 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 box.Я могу отфильтровать метку и другие элементы управления.Я не могу понять, как получить значения элементов управления внутри оператора foreach.Я предполагаю, что мне нужно преобразовать элемент управления как нечто, что позволит мне получить свойство .Value, потому что универсальный элемент управления не даст мне свойство .Value.способ получения значений из TextBox и DropDowns в цикле foreach?

Большое спасибо.

Ответы [ 4 ]

2 голосов
/ 23 июня 2011

Вам нужно будет привести элемент к соответствующему типу элемента управления, чтобы получить доступ к его свойствам.

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

}
1 голос
/ 23 июня 2011

Кроме того, вы можете использовать Linq, чтобы получить IEnumerable текстовых полей и IEnumerable DropDownLists:

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 голосов
/ 23 июня 2011

Не можете ли вы использовать свойство Text элементов управления?Таким образом, вам не нужно заботиться о том, что это за контроль.Какого типа вам нужно значение?Будет ли строка делать?

foreach (Control item in Panel_Controls.Controls)
{
   string value = item.Text;
   // do something with the value
}
0 голосов
/ 23 июня 2011

Вы должны привести предмет к Textbox как:

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

Вы можете сделать то же самое для любого другого элемента управления

...