Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
ASP.NET 2.0 / 3.5 / 4.0
FindControl in un contesto di databind e di pagine master
sabato 24 aprile 2010 - 13.32
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
andrestu
Profilo
| Expert
772
messaggi | Data Invio:
sab 24 apr 2010 - 13:32
Sto creando dei controlli personalizzati e a tal proposito volevo sapere se ci sono soluzioni alternative x ricercare controlli da codice, vi faccio subito alcuni esempi x spiegarvi meglio.
ho x esempio questa struttura:
MasterPage1.master --> MasterPage2.master --> home.aspx
quindi la master di home è MasterPage2.master e la master di MasterPage2.master è la MasterPage1.master
A questo punto se ho il mio controllo personalizzato in home.aspx e dal suo codice interno devo ricercare un altro controllo (non sto a spiegarvi il perchè, sono praticamente 2 controlli personalizzati con una logica collegata) che si trova nella prima master (MasterPage1.master) il codice sarà il seguente:
Image imgCtrl = (Image)Page.Master.Master.FindControl("IdImage");
Il punto è che la struttura potrebbe essere diversa e quindi avere anche 3 master nidificate oppure nessuna e quindi se voglio fare in modo che il controllo personalizzato1 trovi sempre in ogni caso l'altro controllo devo prevedere quasi tutti i casi nel codice, non proprio tutti ma almeno fino a 3/4 nidificazioni...
quindi la prima domanda è:
cè la possibilità di arrivare direttamente alla prima master senza dover prevedere tutte le ipotesi di master concatenate????
---------------------------
Come alternativa posso mettere tutti e due i controlli personalizzati nella home e usare il seguente codice:
Image imgCtrl = (Image)this.Parent.FindControl("IdImage");
e così mi levo da tutti i problemi (così pensavo). Il punto è che se il controllo personalizzato1 che esegue la ricerca dell'altro controllo si trova all'interno di una listview e laltro all'esterno della listview non si trovano più, probabilmente perchè all'interno della listview viene creato un container e il codice ...this.parent... lo cerca li dentro quando invece è all'esterno.
Ci sono consigli e soluzioni alternative in merito???
tonyexpo
Profilo
| Senior Member
229
messaggi | Data Invio:
sab 24 apr 2010 - 15:01
Ciao
il problema è frequente ;)
io ho risolto facendomi un metodo che cerca in modo ricorsivo con una extension quindi basta averla visibile nel tuo progetto e su tutti i controlli (pagina inclusa) hai sempre questo nuovo metodo di ricerca
public static class Extensions
{
public static Control FindNestedControl(this Control control, string ID)
{
if (control == null || string.IsNullOrEmpty(ID))
return null;
else if (control.ID == ID)
return control;
else if (control.Controls.Count > 0)
{
foreach (Control c in control.Controls)
{
var found = c.FindNestedControl(ID);
if (found != null)
return found;
}
return null;
}
else
return null;
}
}
Antonio Esposito
MCT, MCPD, MCTS, MCP
http://blogs.dotnethell.it/espositos
andrestu
Profilo
| Expert
772
messaggi | Data Invio:
sab 24 apr 2010 - 15:29
se non ho capito male creo questa nuova classe nella cartella App_Code, e poi quando richiamo il metodo oltre al nome dell'id devo passargli l'oggetto page corrente?
andrestu
Profilo
| Expert
772
messaggi | Data Invio:
sab 24 apr 2010 - 15:38
ma grande!!!! funziona!!! sai quante volte mi son sbattuto come un maiale a cercare sti benedetti controlli e non avevo pensato ad una soluzione simile...
l'unica cosa che mi viene da pensare è che se la pagina ha molti controlli, x ogni ricerca si consumano un bel pò di risorse
tonyexpo
Profilo
| Senior Member
229
messaggi | Data Invio:
sab 24 apr 2010 - 16:00
mi fa piacere che funzioni :)
bè al peggio avrai un centinaio di controllli e visto che .NET verifica solo che l'ID sia uguale all'altro ID è un confronto che consuma quasi niente..... non preoccuparti
l'unico vero problema potresti averlo se usi il metodo per cercare un controllo autogenerato in un gridview o un listview, poichè in realtà di controlli con quell'id ce ne sono più di uno si dovrebbe fare un nuovo metodo esplicito per cercare tipo sul .CommandName o .CommandArgument se ad esempio si parla di un LinkButton...
ma non preocuparti
ciao
Antonio Esposito
MCT, MCPD, MCTS, MCP
http://blogs.dotnethell.it/espositos
andrestu
Profilo
| Expert
772
messaggi | Data Invio:
sab 24 apr 2010 - 16:47
be forse in quel caso si può fare la ricerca passando il ClientId al posto dell'id...
comunque x ora la ricerca al massimo avviene dall'interno di un gridview/listview verso l'esterno quindi non ho questo prob. (x il momento)
comunque grazie ancora
Torna su
Stanze Forum
Elenco Threads
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?
Dopo esserti registrato potrai chiedere
aiuto sul nostro
Forum
oppure aiutare gli altri
Consulta le
Stanze
disponibili.
Registrati ora !