2011-12-21 3 views
10

Я ищу пример кода, как получить всех дочерних элементов родительского контроля.Как получить всех детей родительского контроля?

Я понятия не имею, как это сделать.

foreach (Control control in Controls) 
{ 
    if (control.HasChildren) 
    { 
    ?? 
    } 
} 
+0

Ваш вопрос неясно. Как вы хотите «получить» эти элементы управления, понимая, как вы уже знаете, как их перебирать? –

+0

Вы уже итерируете детей с помощью петли foreach. По крайней мере, дети этого. Контролирует, по-видимому, форму. Не совсем ясно, что вы имеете в виду под «родительским контролем». –

ответ

15

Если вы хотите только непосредственные дети, используйте

... 
var children = control.Controls.OfType<Control>(); 
... 

Если вы хотите, чтобы все элементы управления из иерархии (то есть, все в дереве под определенным контролем), используйте:

private IEnumerable<Control> GetControlHierarchy(Control root) 
    { 
     var queue = new Queue<Control>(); 

     queue.Enqueue(root); 

     do 
     { 
      var control = queue.Dequeue(); 

      yield return control; 

      foreach (var child in control.Controls.OfType<Control>()) 
       queue.Enqueue(child); 

     } while (queue.Count > 0); 

    } 

Затем, вы можете использовать что-то подобное в виде:

private void button1_Click(object sender, EventArgs e) 
    { 
     /// get all of the controls in the form's hierarchy in a List<> 
     var controlList = GetControlHierarchy(this).ToList(); 

     foreach (var control in controlList) 
     { 
      /// do something with this control 
     } 
    } 

Обратите внимание, что .ToList() немедленно оценит весь Перечислимый, что избавит вас от любых преимуществ, которые вы могли бы получить от реализации сопрограммы.

4

управления имеют MyControl.Controls коллекцию, которую вы можете сделать foreach дальше.

Каждый элемент управления также имеет свойство Parent, которое дает вам родительский контроль.

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

2

Может быть, это может быть полезным для кого-то:

public void GetControlsCollection(Control root,ref List<Control> AllControls, Func<Control,Control> filter) 
{ 
    foreach (Control child in root.Controls) 
    { 
     var childFiltered = filter(child); 
     if (childFiltered != null) AllControls.Add(child); 
     if (child.HasControls()) GetControlsCollection(child, ref AllControls, filter); 
    } 
} 

Это рекурсивная функция, чтобы получить коллекцию элементов управления с возможностью Appling фильтра (для expample по типу). И пример:

List<Control> resultControlList = new List<Control>(); 
GetControlsCollection(rootControl, ref resultControlList, new Func<Control,Control>(ctr => (ctr is DropDownList)? ctr:null)); 

Это будет возвращать все DropDownLists в rootControl и его все дети

0

Возможно слишком сложным, но с помощью Linq и некоторые идеи выше/других мест:

public static IEnumerable<Control> GetAllChildren(this Control root) { 
     var q = new Queue<Control>(root.Controls.Cast<Control>()); 

     while (q.Any()) { 
      var next = q.Dequeue(); 
      next.Controls.Cast<Control>().ToList().ForEach(q.Enqueue); 

      yield return next; 
     } 
    } 
Смежные вопросы