Итерирование по ControlCollection возвращает 0 результатов

У меня есть следующий метод, чтобы вернуть список WebControls в моем классе помощника:

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 должен позаботиться о неиспользованном списке и удалить его из памяти).

Другие вопросы по тегам