2011-12-14 3 views
1

У меня есть оконная форма, которая имеет пару комбинированных ящиков. Что мне нужно, так это иметь все поля со списком, в которых есть элементы, для которых их выбранный индекс установлен равным 0. Вместо того, чтобы делать каждое поле со списком по имени вручную, есть функция, которая возвращает все дочерние элементы по типу. Или получить всех детей и сравнить их тип с типом элемента combobox?Элементы формы окна петли C#

@noah, ваш исходный код не работал сначала, но все, что мне было нужно, было напоминанием о том, что дети называются элементами управления (спасибо).

С, что я сделал рекурсивную функцию, которая устанавливает все поля со списком не только прямые потомки основного вида:

private void recursiveSetComboBox(Control element) 
{ 
    foreach (Control a in element.Controls) 
    { 
     if (a.Controls.Count != 0) 
      recursiveSetComboBox(a); 
     else if (a.GetType().Name == "ComboBox") 
     { 
      ComboBox b = (ComboBox)a; 

      b.SelectedIndex = 0; 
     } 
    } 
} 

recursiveSetComboBox(this); 
+0

вы можете просто написать 'а есть ComboBox' проверить тип. .. –

ответ

3

Это, как я хотел бы сделать это:

foreach (var comboBox in myForm.Controls.OfType<ComboBox>()) 
{ 
    comboBox.SelectedIndex = 0; 
} 

Если комбинированные окна не непосредственно на форме, но внутри контейнера (группа коробки, панели и т.д.), а затем использовать что вместо Myform.

+0

это решение .NET 3.5+ –

+0

@ Serge-appTranslator: да, конечно. –

+0

Что произойдет, если выпадающее поле находится внутри панели или группового ящика? – Jonathan

1

Вы можете перечислить средства управления и фильтровать их с помощью Linq:

foreach (var comboBox in yourForm.Controls.OfType<ComboBox>()) 
{ 
} 

Но если у вас есть элементы управления внутри другого элемента управления (например, comboboxes внутри панели), вам придется сделать рекурсивную версию.

0

Вы можете перебирать элементы управления в форме, таким образом:

foreach(Control c in MyForm.Controls) 
{ 
//Do something here 
} 

Но помните, что один из этих элементов управления может быть groupox или панель, которая имеет элементы управления внутри, так что вы будете нуждаться в какой-то рекурсивную функцию, которая возвращает все элементы управления в форме независимо от того, находится ли один элемент управления внутри другого, а затем фильтрует коллекцию по типу.

Но у нас есть удачи, другой пост в Stackoverflow имеет решение этой проблемы: Get available controls from a form using C#

0

Вы можете перебрать элементы управления на вашей форме, как это:

foreach (Control control in MyForm.Controls) { 
    // test control type 
} 

Обратите внимание, что если вы вставляете элемент управления (например, поместите его в панель макета таблицы), тогда это не поможет вам контролировать.

Вместо этого вам нужно рекурсивно вызвать метод, чтобы найти элементы управления и каждый раз проверить вы ли элемент управления смотрите на has child controls

2

Вы должны использовать рекурсивную функцию для проверки каждого элемента управления и его детей .. попробуйте это:

public void CheckForComboBox(Control crl) 
{ 
foreach (Control crl in this) { 

    if (crl is ComboBox && ((ComboBox)crl).Items.Count > 0) { 
     ((ComboBox)crl).SelectedIndex = 1; 
    } else if (crl.Controls != null && crl.Controls.Count > 0) { 
     CheckForComboBox(crl); 
    } 
} 
} 
0

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

foreach (Control group in this.Controls)    //Control combo in this.Controls) 
      { 

       if (group.GetType().Name == "GroupBox") //(con is ComboBox) 
       { 
        foreach (Control con in group.Controls) 
        { 
         if (con.GetType().Name == "ComboBox") 
         { 

          ComboBox combo = (ComboBox)con; 
          _dtStaff=new DataTable(); 
           _dtStaff = _staff.getStaffList(); 
          combo.DataSource = _dtStaff; 
          combo.DisplayMember = _dtStaff.Columns[1].ToString(); 
          combo.ValueMember = _dtStaff.Columns[0].ToString(); 
         } 
        } 
       } 
      } 
Смежные вопросы