10 messaggi dal 05 febbraio 2009
Avendo creato un server custom control, avrei bisogno, prima di innestare degli script in pagina (nel metodo OnPreRender, sovraccaricato ad hoc per il controllo in questione), di sapere anzitempo(!) quanti di essi sono presenti in pagina (quanti dei "miei" custom control ha, l'utente, messo in pagina). Questo lo si evince, come sappiamo, dal file designer (XXX.designer.cs) della pagina ospite (protected global::Mio.Name.Space.MioCustomControl myControl; ad esempio).
Avevo pensato di ricorrere alla reflection, ma da quanto letto, e provato, dal web non sono riuscito nell'intento.
Posto all'uopo il metodo che ho approntato come bozza per il mio intento (trattasi di una prova):
   
        private int GetNumbersControls()
        {
            ArrayList fields = null;
            try
            {
                fields = new ArrayList();
                //_page è un campo privato di classe istanziato e valorizzato
                //una sola volta come da Singleton pattern
                Type type = _page.GetType();
                if (type != null)
                {
                    foreach (FieldInfo field in type.GetFields(
                        BindingFlags.Public
                        | BindingFlags.Instance
                        | BindingFlags.Static
                        | BindingFlags.NonPublic
                        | BindingFlags.DeclaredOnly))
                    {
                        fields.Add(field.Name.ToString()
                            + " : " + field.Attributes.ToString()
                            + " [" + field.FieldType.FullName + "]");
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return fields.Count;
        }

Non v'è traccia, da debug, di alcun campo da me atteso.

Ringrazio davvero di cuore chiuque sappia illuminarmi nella risoluzione della problematica.
vibstudio wrote:
Avevo pensato di ricorrere alla reflection, ma da quanto letto, e provato, dal web non sono riuscito nell'intento.

in questo caso la reflection serve a poco. potresti di sicuro scorrere l'intero albero dei controlli con performance migliori, ma comunque non sufficienti.
la strada migliore è quella di salvare, nel costruttore del tuo controllo, un valore all'interno di una variabili visibile a livello di pagina. la cosa più facile in questo senso è utilizzare la collection Items di HttpContext:
http://www.aspitalia.com/script/478/Condividere-Variabile-Interno-Oggetti-Pa gina-ASP.NET.aspx

Daniele Bochicchio | ASPItalia.com
I libri su HTML5, WP7, ASP.NET, VB, C#, Entity Framework
Senior Software Architect@5DLabs.it
Microsoft Regional Director for Italy
10 messaggi dal 05 febbraio 2009
Cerco di esporre la problematica da un'angolatura differente.
Lo scenario potrebbe essere il seguente:
- lo sviluppatore decide di mettere in pagina due "MyCustomControl";
- l'utente finale lancia la pagina;
- alla prima richiesta di rendering per MyCustomControl1 il metodo (in override mode) OnPreRender provvede a costurire lo script (jQuery) e di registrarlo in pagina
      
        protected override void OnPreRender(EventArgs e)      
        {      
            ........................      
      
            base.OnPreRender(e);      
      
            ClientScriptManager cs = this.Page.ClientScript;      
      
            ........................      
      
            //Registrazione dello script personalizzato in pagina      
            ScriptManagerProxy sm = ScriptManagerProxy.GetInstance(this.Page, this);      
            cs.RegisterStartupScript(GetType(), SCRIPTCALLERKEY, sm.GetScript(this), true);      
        }      

- alla seconda richiesta avverà la generazione del nuovo script (compito affidato ad una classe creata ad hoc che tiene in pancia il numero di MyCustomControl), ovviamente differente dal primo, ED E' QUI che la registrazione fallisce: il metodo RegisterStartupScript della classe ClientScriptManager non sovrascrive il vecchio script.
Avevo pensato, dunque, di non registrare alcuno scipt fintanto che il numero di controlli passati al metodo (GetScript(Control control) della mia classe ScriptManagerProxy) non è uguale al numero di controlli effettivi in pagina.
Sto percorrendo una strada ceca? Non lo so, ma nel generare gli script personalizzati avvalendomi di jQuery esiste altro modo?

Grazie per la compassione!!
vibstudio wrote:
Sto percorrendo una strada ceca? Non lo so, ma nel generare gli script personalizzati avvalendomi di jQuery esiste altro modo?

più che ceca, sbagliata. se il tuo problema è solo quello di far generare uno script solo all'ultima chiamata, devi utilizzare un sistema differente. ad esempio quello di dotare il tuo script javascript di un metodo che registri i controlli, così che l'inclusione del riferimento esterno lo faccia il controllo, e ciascuno si registri come gli pare. es
myScript.initialize('myid');

dove myScript è un oggetto Javascript e initialize un metodo che salva il riferimento. in questo modo non serve fare niente nei controlli e puoi utilizzarne quanti te ne pare senza problemi

Daniele Bochicchio | ASPItalia.com
I libri su HTML5, WP7, ASP.NET, VB, C#, Entity Framework
Senior Software Architect@5DLabs.it
Microsoft Regional Director for Italy
10 messaggi dal 05 febbraio 2009
E' stato il mio primo pensiero, a dir il vero, ma, accecato, alla ricerca dell'"eleganza assoluta" avevo iniziato a barcamenarmi, come di consueto  , in idee, alternative sì, ma non poco arzigogolate e stupidamente complesse.
Da sempre tuo grande fan, non ho potuto che seguire il tuo consiglio e risolvere, con estrema semplicità, il problema che nel corso degli ultimi giorni (e meno male che sono in ferie  ) mi ha attanagliato.
Grazie per il consiglio, grazie per esserci.

VIBstudio
vibstudio wrote:
Grazie per il consiglio, grazie per esserci.

esagerato, ma grazie!
contento che tu abbia risolto

Daniele Bochicchio | ASPItalia.com
I libri su HTML5, WP7, ASP.NET, VB, C#, Entity Framework
Senior Software Architect@5DLabs.it
Microsoft Regional Director for Italy

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
    In primo piano

    I più letti di oggi

    Media
    In evidenza
    MISC