por nombre example control buscar aspx asp.net findcontrol

nombre - Mejor forma de encontrar el control en ASP.NET



buscar control por nombre c# (8)

Gestión de acciones en controles

Cree una clase inferior en la clase base. Clase Para obtener todos los controles:

public static class ControlExtensions { public static IEnumerable<T> GetAllControlsOfType<T>(this Control parent) where T : Control { var result = new List<T>(); foreach (Control control in parent.Controls) { if (control is T) { result.Add((T)control); } if (control.HasControls()) { result.AddRange(control.GetAllControlsOfType<T>()); } } return result; } }

Desde la base de datos: Obtenga todas las acciones ID (como divAction1, divAction2 ....) dynamic en DATASET (DTActions) permiten usuarios específicos.

En Aspx: en HTML Ponga acción (botón, ancla, etc.) en div o span y asígneles id como

<div id="divAction1" visible="false" runat="server" clientidmode="Static"> <a id="anchorAction" runat="server">Submit </a> </div>

EN CS: Use esta función en su página:

private void ShowHideActions() { var controls = Page.GetAllControlsOfType<HtmlGenericControl>(); foreach (DataRow dr in DTActions.Rows) { foreach (Control cont in controls) { if (cont.ClientID == "divAction" + dr["ActionID"].ToString()) { cont.Visible = true; } } } }

Tengo un formulario complejo de asp.net, que tiene de 50 a 60 campos en una forma, como Multiview , dentro de MultiView tengo una GridView , y dentro de GridView tengo varios CheckBoxes .

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

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


Decidí simplemente construir diccionarios de control. Más difícil de mantener, podría correr más rápido que el FindControl recursivo ().

protected void Page_Load(object sender, EventArgs e) { this.BuildControlDics(); } private void BuildControlDics() { _Divs = new Dictionary<MyEnum, HtmlContainerControl>(); _Divs.Add(MyEnum.One, this.divOne); _Divs.Add(MyEnum.Two, this.divTwo); _Divs.Add(MyEnum.Three, this.divThree); }

Y antes de bajarme los pulgares por no responder la pregunta del OP ...

P: Ahora, mi pregunta es ¿hay alguna otra forma / solución para encontrar el control anidado en ASP.NET? R: Sí, evite la necesidad de buscarlos en primer lugar. ¿Por qué buscar cosas que ya sabes están ahí? Es mejor construir un sistema que permita la referencia de objetos conocidos .


El siguiente ejemplo define un controlador de eventos Button1_Click. Cuando se invoca, este controlador utiliza el método FindControl para ubicar un control con una propiedad de ID de TextBox2 en la página que lo contiene. Si se encuentra el control, su padre se determina usando la propiedad Parent y la ID del control padre se escribe en la página. Si no se encuentra TextBox2, se escribe "Control no encontrado" en la página.

private void Button1_Click(object sender, EventArgs MyEventArgs) { // Find control on page. Control myControl1 = FindControl("TextBox2"); if(myControl1!=null) { // Get control''s parent. Control myControl2 = myControl1.Parent; Response.Write("Parent of the text box is : " + myControl2.ID); } else { Response.Write("Control not found"); } }


Encuentre de forma recursiva todos los controles que coincidan con el predicado especificado (no incluya Control de raíz):

public static IEnumerable<Control> FindControlsRecursive(this Control control, Func<Control, bool> predicate) { var results = new List<Control>(); foreach (Control child in control.Controls) { if (predicate(child)) { results.Add(child); } results.AddRange(child.FindControlsRecursive(predicate)); } return results; }

Uso:

myControl.FindControlsRecursive(c => c.ID == "findThisID");


Si está buscando un tipo específico de control, puede usar un ciclo 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 de costumbre. Si alguien todavía está interesado en esto, hay una serie de questions y answers relacionadas con SO. Mi versión del método de extensión recursivo 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 resaltadas usan recursividad (que es un rendimiento costoso). Aquí hay una manera más limpia sin recurrencia:

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


FindControl no busca dentro de los controles anidados recursivamente. Solo encuentra controles en los que NamigContainer es el Control en el que está llamando FindControl.

Hay un motivo por el que ASP.Net no examina los controles anidados recursivamente de manera predeterminada:

  • Actuación
  • Evitando errores
  • Reusabilidad

Considere que desea encapsular sus GridViews, Formviews, UserControls, etc. dentro de otros UserControls por razones de reusabilidad. Si hubiera implementado toda la lógica en su página y accedido a estos controles con bucles recursivos, será muy difícil refactorizar eso. Si ha implementado su lógica y métodos de acceso a través de los manejadores de eventos (fe RowDataBound of GridView), será mucho más simple y menos propenso a errores.