Итерирование по ControlCollection возвращает 0 результатов
У меня есть следующий метод, чтобы вернуть список WebControl
s в моем классе помощника:
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)
неправильно.
Пожалуйста, помогите мне найти изъян в моей цепочке мыслей.
2 ответа
Ваш 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>());
}
Вы можете использовать решение Snram или просто:
if (control.HasControls())
results.AddRange(GetControls<T>(control.Controls));
Единственное, что вам нужно - это добавить к результату рекурсивный вывод вызова.
Snram
Решение может быть намного лучше, потому что вы не создаете экземпляр списка каждый рекурсивный вызов (в моем решении GC должен позаботиться о неиспользованном списке и удалить его из памяти).