2010-02-05 12 views
8

C#modo facile da usare FindControl ("")

Ciao,

Sono stato lo sviluppo di applicazioni web C# per un paio di anni e non v'è un problema che continuo a upagainst che non posso trova un modo logico per risolvere.

Ho un controllo a cui desidero accedere nel codice dietro, questo controllo è profondo nel markup; sepolto all'interno di ContentPlaceHolders, UpdatePanels, Panels, GridViews, EmptyDataTemplates, TableCells (o qualsiasi altra struttura tu voglia ... il punto è che ha più genitori che farthers per la giustizia).

Come posso usare FindControl("") per accedere a questo comando senza fare questo:

Page.Form.Controls[1].Controls[1].Controls[4].Controls[1].Controls[13].Controls[1].Controls[0].Controls[0].Controls[4].FindControl(""); 

risposta

12

Scrivete un metodo helper chiamato FindControlRecursive come previsto da Jeff Atwood se stesso.

private Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id) 
    { 
     return root; 
    } 

    foreach (Control c in root.Controls) 
    { 
     Control t = FindControlRecursive(c, id); 
     if (t != null) 
     { 
      return t; 
     } 
    } 

    return null; 
} 

http://www.codinghorror.com/blog/archives/000307.html

+0

+1 compito perfetto per la ricorsione –

+0

Solo un commento di stare attenti se il calo di prestazioni esageri la ricorsione. Sicuramente ancora un +1. –

+0

Cheers, solo il trucco :) – WillDud

3

Uso ricorsivo FindControl:

public T FindControl<T>(string id) where T : Control 
    { 
     return FindControl<T>(Page, id); 
    } 

    public static T FindControl<T>(Control startingControl, string id) where T : Control 
    { 
     // this is null by default 
     T found = default(T); 

     int controlCount = startingControl.Controls.Count; 

     if (controlCount > 0) 
     { 
      for (int i = 0; i < controlCount; i++) 
      { 
       Control activeControl = startingControl.Controls[i]; 
       if (activeControl is T) 
       { 
       found = startingControl.Controls[i] as T; 
        if (string.Compare(id, found.ID, true) == 0) break; 
        else found = null; 
       } 
       else 
       { 
        found = FindControl<T>(activeControl, id); 
        if (found != null) break; 
       } 
      } 
     } 
     return found; 
    } 
0

O in LINQ:

 private Control FindControlRecursive(Control root, string id) 
     { 
      return root.ID == id 
         ? root 
         : (root.Controls.Cast<Control>() 
          .Select(c => FindControlRecursive(c, id))) 
          .FirstOrDefault(t => t != null); 
     } 
Problemi correlati