FindControl получает неправильный контроль в моем рекурсивном методе

Я использую следующий метод для рекурсивного поиска элемента управления на странице asp.net:

    /// <summary>
    /// Searches recursively for a server control with the specified id parameter.
    /// </summary>
    /// <param name="start">The start.</param>
    /// <param name="id">The id.</param>
    /// <returns>A <see cref="Control"/></returns>
    public static Control FindControl(Control start, string id)
    {

        Control foundControl;
        if (start == null)
            return null;

        foundControl = start.FindControl(id);
        if (foundControl != null)
            return foundControl;

        foreach (Control c in start.Controls)
        {
            foundControl = FindControl(c, id);
            if (foundControl != null)
                return foundControl;
        }

        return null;
    }

Я столкнулся с проблемой, потому что возвращал неправильный элемент управления. Я отследил проблему до стандартного метода FindControl и исправил ее, проверив, что идентификатор возвращенного элемента управления действительно совпадает с запрошенным следующим образом:

    foundControl = start.FindControl(id);
        if (foundControl != null && foundControl.ID == id)
            return foundControl;

Мой вопрос: почему start.FindControl (id) когда-либо возвращает элемент управления, который не соответствует запрошенному идентификатору?


person Colin    schedule 11.03.2011    source источник


Ответы (1)


я использую

static class ControlExtension
    {
        public static IEnumerable<Control> GetAllControls(this Control parent)
        {
            foreach (Control control in parent.Controls)
            {
                yield return control;
                foreach (Control descendant in control.GetAllControls())
                {
                    yield return descendant;
                }
            }
        }
    }

и позвони

var foundControl =  Page.GetAllControls().Where(c => c.ID = id);

РЕДАКТИРОВАТЬ:

возможно, вместо того, чтобы вызывать это, чтобы начать поиск

 foundControl = start.FindControl(id);

ты должен начать с

foundControl = FindControl(start, id);
person Bala R    schedule 11.03.2011
comment
Да, вообще не использует FindControl, выглядит очень мощно, находит элементы управления по любым критериям, которые мне нравятся. К сожалению, я застрял в месте, которое не хочет обновляться до C # 3.0, поэтому пока нет лямбда-выражений .... Я все еще мог бы переписать свой метод на C # 2.0, чтобы просто проверить, совпадает ли идентификатор без использования FindControl, но я было любопытно, как FindControl может вернуть элемент управления, который явно не соответствует идентификатору, указанному в параметре. - person Colin; 12.03.2011
comment
Повторите редактирование. Мне нужен foundControl = start.FindControl (id); или каким-либо другим способом определения правильного элемента управления, в противном случае он всегда будет нулевым. - person Colin; 12.03.2011
comment
Я мог бы переписать его, чтобы просто сравнить идентификаторы внутри цикла, т.е. if (c.id == id) return c; Мне было просто любопытно неожиданное поведение FindControl, и мне было интересно, сталкивался ли кто-нибудь еще с этой проблемой - person Colin; 12.03.2011