2010-10-14 11 views
5

risolvere un ID client di un controllo elemento ripetitore e voglio utilizzarlo in un altro comando, in che modo non riesco a ottenere il controllo tramite il suo ID client?ottenere il controllo da clientID

TextBox TB = FindControl ...?

risposta

7

Stai cercando di trovare la casella di testo che risiede all'interno del ripetitore? In tal caso, è possibile utilizzare il metodo seguente per le ricerche in base all'ID del controllo: è possibile modificarlo per verificare in base al clientID del controllo.

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

Grazie mille! Mi ha aiutato così tanto. –

0
<%= Control.ClientID %> 
0

Avete accesso allo specifico RepeaterItem (come nel gestore di eventi ItemDataBound)?

In tal caso, è possibile eseguire repeaterItem.FindControl("YourControlId") per ottenere il controllo figlio.

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

Invece di loop tutti i controlli in tutta la struttura di controllo si potrebbe dividere e andare dal gruppo fino un controllo al 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: Questa funzione utilizza ClientIDSeparator sua una proprietà protetta definito nella classe Control, quindi questo metodo deve essere utilizzato in qualcosa che eredita Control.

0

Il codice corto è qui:

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