Mejor manera de encontrar control en ASP.NET
Tengo un formulario asp.net complejo, que tiene incluso de 50 a 60 campos en un formulario Multiview
, dentro de MultiView tengo un GridView
y 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.
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);
}
}
}
}
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;
}
}
}
}
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);
}