Mejor manera de encontrar control en ASP.NET

Resuelto santosh singh asked hace 13 años • 9 respuestas

Tengo un formulario asp.net complejo, que tiene incluso de 50 a 60 campos en un formulario Multiview, dentro de MultiView tengo un GridViewy dentro de GridView tengo varios CheckBoxes.

Actualmente estoy usando el encadenamiento del FindControl()método y recuperando la identificación del niño.

Ahora, mi pregunta es si existe alguna otra forma/solución para encontrar el control anidado en ASP.NET.

santosh singh avatar Feb 10 '11 17:02 santosh singh
Aceptado

Si está buscando un tipo específico de control, puede usar un bucle recursivo como este: http://weblogs.asp.net/eporter/archive/2007/02/24/asp-net-findcontrol-recursive-with -generics.aspx

Aquí hay un ejemplo que hice que devuelve todos los controles del tipo dado

/// <summary>
/// Finds all controls of type T stores them in FoundControls
/// </summary>
/// <typeparam name="T"></typeparam>
private class ControlFinder<T> where T : Control 
{
    private readonly List<T> _foundControls = new List<T>();
    public IEnumerable<T> FoundControls
    {
        get { return _foundControls; }
    }    

    public void FindChildControlsRecursive(Control control)
    {
        foreach (Control childControl in control.Controls)
        {
            if (childControl.GetType() == typeof(T))
            {
                _foundControls.Add((T)childControl);
            }
            else
            {
                FindChildControlsRecursive(childControl);
            }
        }
    }
}
jimmystormig avatar Feb 10 '2011 10:02 jimmystormig

Tarde como siempre. Si alguien todavía está interesado en esto, hay una serie de preguntas y respuestas relacionadas con SO . Mi versión del método de extensión recursiva para resolver esto:

public static IEnumerable<T> FindControlsOfType<T>(this Control parent)
                                                        where T : Control
{
    foreach (Control child in parent.Controls)
    {
        if (child is T)
        {
            yield return (T)child;
        }
        else if (child.Controls.Count > 0)
        {
            foreach (T grandChild in child.FindControlsOfType<T>())
            {
                yield return grandChild;
            }
        }
    }
}
David Clarke avatar Dec 08 '2011 03:12 David Clarke

Todas las soluciones destacadas utilizan la recursividad (lo cual implica un alto costo de rendimiento). Aquí hay una forma más limpia y sin recursividad:

public T GetControlByType<T>(Control root, Func<T, bool> predicate = null) where T : Control 
{
    if (root == null) {
        throw new ArgumentNullException("root");
    }

    var stack = new Stack<Control>(new Control[] { root });

    while (stack.Count > 0) {
        var control = stack.Pop();
        T match = control as T;

        if (match != null && (predicate == null || predicate(match))) {
            return match;
        }

        foreach (Control childControl in control.Controls) {
           stack.Push(childControl);
        }
    }

    return default(T);
}
Ondrej Svejdar avatar Sep 04 '2015 13:09 Ondrej Svejdar