2010-10-14 12 views
5

Resuelvo una identificación de cliente de un control de artículo repetidor, y quiero usarlo en otro comando, ¿cómo puedo obtener el control por su id de cliente?obtener el control por ID de cliente

TextBox TB = FindControl ...?

Respuesta

7

¿Está tratando de encontrar el cuadro de texto que reside dentro del repetidor? De ser así, podría usar el método debajo del cual las búsquedas se basan en la ID del control; en cambio, podría modificarlo para verificarlo en función del ID de cliente del control.

public static System.Web.UI.Control FindControlIterative(System.Web.UI.Control root, string id) 
    { 
     System.Web.UI.Control ctl = root; 
     var ctls = new LinkedList<System.Web.UI.Control>(); 

     while (ctl != null) 
     { 
      if (ctl.ID == id) 
       return ctl; 
      foreach (System.Web.UI.Control child in ctl.Controls) 
      { 
       if (child.ID == id) 
        return child; 
       if (child.HasControls()) 
        ctls.AddLast(child); 
      } 
      if (ctls.First != null) 
      { 
       ctl = ctls.First.Value; 
       ctls.Remove(ctl); 
      } 
      else return null; 
     } 
     return null; 
    } 
+1

Muchas gracias! Eso me ayudó mucho. –

0
<%= Control.ClientID %> 
0

¿Tiene acceso al RepeaterItem específico (como lo haría en el controlador de eventos ItemDataBound)?

Si es así, puede hacer repeaterItem.FindControl("YourControlId") para obtener el control del niño.

0
public static System.Web.UI.Control GetControlIterativeClientID(System.Web.UI.Control root, string id) 
    { 
     System.Web.UI.Control ctl = root; 
     var ctls = new LinkedList<System.Web.UI.Control>(); 
     if (root != null) 
     { 
      if (ctl.ID == id) 
       return ctl; 
      foreach (System.Web.UI.Control child in ctl.Controls) 
      { 
       if (child.ID == id) 
        return child; 
       if (child.HasControls()) 
        GetControlIterativeClientID(child, id);       
      }     
     } 
     return null; 
    } 
0

En lugar de bucle todos los controles en todo el árbol de control se puede dividir e ir del grupo hasta un control en el momento:

public Control GetControlByClientId(string clientId) 
{ 
    Queue<string> clientIds = new Queue<string>(clientId.Split(ClientIDSeparator)); 
    Control root = this.Page; 
    string subControlId = null; 
    while (clientIds.Count > 0) 
    { 
     if (subControlId == null) 
     { 
      subControlId = clientIds.Dequeue(); 
     } 
     else 
     { 
      subControlId += ClientIDSeparator + clientIds.Dequeue(); 
     } 
     Control subControl = root.FindControl(subControlId); 
     if (subControl != null) 
     { 
      root = subControl; 
      subControlId = null; 
     } 
    } 
    if (root.ClientID == clientId) 
    { 
     return root; 
    } 
    else 
    { 
     throw new ArgumentOutOfRangeException(); 
    } 
} 

Nota: Esta función utiliza ClientIDSeparator es una propiedad protegida que se define en la clase Control, por lo que este método se debe usar en algo que hereda Control.

0

El código corto es aquí:

private Control getControl(Control root, string pClientID) 
{ 
    if (root.ClientID == pClientID) 
     return root; 
    foreach (Control c in root.Controls) 
     using (Control subc= getControl(c, pClientID)) 
      if (subc != null) 
       return subc; 
    return null; 
} 
Cuestiones relacionadas