FindControl получает неправильный контроль в моем рекурсивном методе - PullRequest
1 голос
/ 11 марта 2011

Я использую следующий метод для рекурсивного поиска элемента управления на странице 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) когда-либо возвращает элемент управления, который не соответствует запрошенному идентификатору?

1 Ответ

2 голосов
/ 11 марта 2011

Я использую

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);
...