2014-10-23 3 views
0

У меня есть следующий метод возвращает список WebControl с в моем вспомогательном классе:Перебор ControlCollection возвращает 0 результатов

public static List<T> GetControls<T>(ControlCollection cCol) where T : WebControl 
{ 
    List<T> results = new List<T>(); 
    foreach (Control control in cCol) 
    { 
     if (control is T) 
      results.Add((T)control); 

     if (control.HasControls()) 
      GetControls<T>(control.Controls); 
    } 
    return results; 
} 

На моей странице ASPX есть один UpdatePanel, содержащий 3 asp:CheckBoxList управления. Чтобы заполнить мой список, я использую описанный выше метод, где CheckBoxPanel - это UpdatePanel, содержащий мои элементы управления.

List<CheckBoxList> cbCol = Helper.GetControls<CheckBoxList>(CheckBoxPanel.Controls); 

Эта строка возвращает 0 результатов, что свидетельствует, что мой метод GetControls<T>(ControlCollection cCol) неправильно.

Пожалуйста, помогите мне найти недостаток в моем движении мыслей.

ответ

1

Ваш results является локальной переменной. Поэтому для каждого рекурсивного вызова вы добавляете некоторые элементы управления и забываете об этом.

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

Не тестировался, но следующий код должен работать:

private static List<T> GetControls<T>(ControlCollection cCol, List<T> results) where T : WebControl 
{ 
    foreach (Control control in cCol) 
    { 
     if (control is T) 
      results.Add((T)control); 
     if (control.HasControls()) 
      GetControls<T>(control.Controls, results); 
    } 

    return results; 
} 

public static List<T> GetControls<T>(ControlCollection cCol) where T : WebControl 
{ 
    return GetControls(cCol, new List<T>()); 
} 
+0

Это всегда простые вещи. Спасибо - работает – Marco

0

Вы можете использовать решение Snram или просто:

if (control.HasControls()) 
      results.AddRange(GetControls<T>(control.Controls)); 

Единственное, что вам нужно, это добавить вывод recrusive вызова на результат.

Snram Решение может быть довольно хорошим, потому что вы не создаете экземпляр экземпляра каждый рекрусивный вызов (в моем решении GC необходимо позаботиться о неиспользуемом списке и удалить его из памяти).

Смежные вопросы