Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Primi passi con UserControl

  1. #1
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,261

    Primi passi con UserControl

    Mi vergogno un po' ma sto facendo i miei primi passi con gli userControl.
    Ne ho creato uno che sostanzialmene mostra una tabellina con una immagine, un paio di label e un textbox... dovrebbe servirmi per fare il caricamento in una tabella di un articolo (la textbox indicherà la quantità da caricare/scaricare nella tabella).

    Ora lo usercontrol è all'interno dell'itemtemplate di un repeater a cui è associata come datasource una datatable con l'elenco degli articoli e varie caratteristiche degli stessi.

    Mi interrogo sull'uso corretto dello usercontrol: devo
    1) prevedere una proprietà nello UC (contenente ad esempio il codice articolo dell'itemtemplate che il repeater sta ciclando), valorizzarla sull'itemdatabound del repeater e, in base a quella, sul pageload dello UC leggere tutte le info dell'articolo che devo mostrare, oppure
    2) preparare tutte le info da mostrare nel datatable bindato al repeater, creare tutte le proprietà da valorizzare nello UC e sul itemdatabound del repeater valorizzarle?

    Spero di essermi spiegato... la differenza è che, nel caso 1, di fatto ad ogni itemdatabound lo usercontrol dovrebbe fare un lavoro ulteriore per valorizzarsi i suoi dati partendo solo dal codice articolo mentre nel caso 2 andrei solo a valorizzare le proprietà dello UC con dati preconfezionati a monte...
    Per fare un esempio concreto, se ora nell'UC volessi mostrare il prezzo del'articolo (che non ho all'interno del datatable bindato al repeater), devo includerlo nel datatable e creare una property nello UC oppure delego lo UC a cercarsi il suo prezzo in base al codice articolo che gli passo come proprietà?
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  2. #2
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,199
    Ti consiglio di fare una sola query, e' una semplice Join e meta' del lavoro lo fa SQL Server.

    Poi l'altra meta' la fa l'applicazione, con la valorizzazione della proprieta', ma permettimi di dire che come scelta forse non e' proprio delle piu' felici, sia per il calo di performance, sia per il fatto che quando vuoi accedere a qualche dato devi fare il famoso FindControl sulla riga per ottenere tutto lo UC, e poi puoi accedere ai suoi valori...

  3. #3
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,261
    si descritta così come l'avevo messa io è un join banale, se però nello UC devo variare il prezzo dell'articolo a seconda della quantità indicata già diventa meno banale e devo gestire la variazione nel codebehind dello UC.

    Domanda: è corretto usare il Set di una property dell'UC per lanciare una serie di operazioni?
    Ad esempio io ora valorizzo la proprietà codart dell'UC nell'itemdatabound del repeater passandogli il valore del datatable che gli ho bindato. Nel Set della proprietà ho inserito anche una funzione che:
    1- prende il valore ricevuto e lo inserisce in una label dell'UC
    2- cerca con Fso se esiste un'immagine relativa all'articolo in una directory apposita e se trova/non trova mostra l'immagine nell'UC oppure nasconde il div che la contiene
    3- interroga il db per verificare se per quell'articolo ci sono scaglioni di quantità con relativi prezzi ed eventualmente disegna una tabellina con queste informazioni
    4- ....

    Is it right o va fatto in eventi/luoghi diversi del codice? Di mio avrei detto che andavano nel pageload dell'UC però mi pare che questo venga fatto prima della valorizzazione delle proprietà (cioè dell'itemdatabound del repeater) quindi se metto lì la mia funzione non ha il dato che gli serve...

    Scusa se faccio domande da gnokko... ma è che sono gnokko e sono anche fuori dall'orto in cui zappo di solito
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,199
    no, di solito le cose che dici vanno fatte nel page load dell'UC leggendo la proprieta'.

    comunque, stai attento: ad ogni postback DELLA PAGINA FUORI devi ricrearli tutti, cosa non proprio simpatica. Questo lo hai considerato ?

  5. #5
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,261
    eh si ho capito però il page load dello UC viene eseguito prima dell'itemdatabound del repeater per cui quando parte il pageload le properties dell'UC non sono ancora valorizzate...
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  6. #6
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,199
    Allora, dalla pagina si, puoi ovviamente settare le proprietà pubbliche dello UC. E' prassi.
    Pero' per la tua domanda, no, NON è prassi fare altro nel Set e nel Get delle proprietà. Quelli dovrebbero essere solo un "proxy".

    Ho capito che il Page_Load dello UC si esegue PRIMA dell'evento ItemDataBound, per questo ti consigliavo di pensare ad un altra strada. Se non ricordo male, con un solo UC nella pagina si risolveva usando il page_init della stessa. Ma con un evento di Bound non saprei.
    Comunque alla fine, se funziona, cio' che hai trovato è un workaround ma potresti anche lasciarlo cosi'.

    Inoltre, non so se sia ancora cosi', ma se sulla pagina viene fatto un postback in un'altro controllo, non sono sicuro che il viewstate mantenga tutto nel tuo repeater.
    Questo lo hai verificato ?
    Ultima modifica di djciko; 03-10-2017 a 16:05

  7. #7
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,261
    Si, mi pare che i postback non diano fastidio... direi che questo funziona.

    Il tutto è un po' strano, nel senso che va tutto ma al contrario di come mi aspettavo dovesse andare: di fatto sto valorizzando quasi tutte le cose mostrate nello UC da fuori (dall'itemdatabound del repeater) mentre, come anche tu mi confermi sarebbe corretto, pensavo di poterle caricare sul load dello UC dopo aver ricevuto valorizzazione di una sola proprietà (il codice articolo).
    Poi lo UC ha tutta una serie di funzioni di modifica dei dati e inserimento in database che per ora vanno anche loro...

    Devo aver sbagliato qualcosa nell'impostazione ma non saprei cosa: repeater + UC mi sembrava l'accoppiata corretta...
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  8. #8
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,199
    Premesso che io non avrei mai usato gli UC in un ItemTemplate di un repeater ma solo 'liberi' sulla pagina, l'ultima prova che ti rimane da fare e' creare a runtime lo UC lato server (nell'itemdatabound), piazzandolo su un placeholder, tipo:

    NomeClasse UC1 = new NomeClasse();
    UC1.proprieta1 = X
    UC1.proprieta2 = Y

    IDPlaceHolder.Controls.Add(UC1);
    (da cercare nell'ItemTemplate con FindControl sulla riga corrente)

    Vedi se cosi' il page load dello UC avviene DOPO l'itemdatabound. Se non va, lascia tutto cosi', perche' e' una scelta di progettazione che hai fatto che ti impone questa strada. Ciao


    (era questa la modalita' con la quale dovevi ricreare gli UC al postback, mi sono ricordato)
    Ultima modifica di djciko; 11-10-2017 a 14:51

  9. #9
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,261
    Ok, grazie mille per le dritte!
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2017 vBulletin Solutions, Inc. All rights reserved.