Caricamento dinamico di controlli e di usercontrol

lunedì 02 febbraio 2009 - 16.19

cicemoi Profilo | Junior Member

Salve,
ho una pagina che crea dinamicamente una asp:table contenente dei controlli
semplici (radiobutton, checkbox, dropdownlist, textbox...) e/o degli usercontrol.

Questi vengono creati in base a delle informazioni presenti nel database. La
stessa pagina contiene un pulsante FISSO che ha come scopo quello di memorizzare
i dati inseriti dall'utente in questi controlli e/o usercontrol.

Tutto sembra funzionare correttamente tranne nel caso in cui vengono caricati
dinamicamente degli Usercontrol; infatti quando clicco sul pulsante per
memorizzare i dati sembra che lo/gli usercontrol presenti nella pagina perdano i dati inseriti
dall'utente; al secondo click l'inserimento dei dati avviene correttamente; ciò NON accade per i controlli semplici in cui viene memorizzato
tutto correttamente subito.
Da notare che ogni volta che passo nell'init della pagina richiamo la sub per la costruzione della tabella altrimenti la pagina perde i controlli creati al momento

Qualcuno sa darmi una spiegazione?
Spero di essere stata un pò chiara

Grazie mille
Cinzia Cipriano

FrancescoGuadagno Profilo | Senior Member

Quando carichi dei controlli a runtime, la gestione della viewstate è a tuo carico. Prova a cercare su google con le parole "LoadControl" e "Viewstate". Troverai tonnellate di articoli sull'argomento.
Ciao

rossimarko Profilo | Guru

Ciao,

gli usercontrol che cosa contengono? Ci sono altri controlli definiti a livello di template oppure sono sempre inseriti da codice? Come vengono caricati gli user control? Con il metodo loadcontrol?

Penso che tu lo sappia già ma di solito il flusso da seguire per gestire i controlli dinamici è:
- creazione nell'oninit
- databind (e quindi relativo popolamento dei controlli) nel page load o in un altro evento associato ad un controllo

Quindi nel caso del salvataggio nell'oninit vanno ricreati i controlli e poi nell'evento save vanno presi i valori e salvati
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

cicemoi Profilo | Junior Member

Si gli usercontrol vengono caricati mediante un loadcontrol e inizializzati richiamando delle loro public sub il tutto nell'init della pagina madre.
Questi sono di vario tipo ... alcuni che contengono dropDownlist fisse i cui dati vengono caricati però dinamicamente (nell'init della pagina madre) e ci sono usercontrol che non contengono nulla e che creano dinamicamente (nell'init della pagina madre) matrici di checkbox.

Avevo già notato che caricandoli nel page_load della pagina madre questi perdevano tutti gli eventi dei controlli interni..ecco perchè ho spostato il load nell'init della pagina madre! solo che ora non riesco a capire come mantenere i dati già dal primo click!

uff

grazie mille per l'aiuto

rossimarko Profilo | Guru

Ma tu hai spostato anche la procedura di caricamento nell'init?

Mi spiego meglio: supponiamo che tu abbia una drop down list. Nell'init crei il controllo, gli associ un id e poi lo aggiungi alla pagina.

Poi nel load della pagina o nell'evento di un pulsante o altro fai il databind, e quindi prendi il riferimento al controllo, imposti il datasource e poi fai il databind. Così rispetti il flusso di asp.net e ti salva i dati nel viewstate.

Anche quando premi il pulsante di salvataggio nell'init devi solo ricreare i controlli mettendo lo stesso id di prima, poi nel save vai a prendere il riferimento e prelevi i valori (in questo caso il databind non serve perchè è già stato fatto la prima volta, se lo fai prima di salvare perdi tutti i valori inseriti dall'utente)
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

cicemoi Profilo | Junior Member

Si faccio una cosa del genere:

oMatriceascx = LoadControl("matrice.ascx")
oMatriceascx = DirectCast(oMatriceascx, matrice)
oMatriceascx.inzializzoMatrice(oMatrice.idMatrice, idUtente, annoRiferimento)
cellaTab.Controls.Add(oMatriceascx)

nell' inzializzoMatrice io vado anche a controllare se sono stati già inseriti dei dati precedentemente dall'utente e in tal caso li mostro. Questa procedura ovviamente viene ripetuta al click del pulsante in quanto si ripassa nell'init e nn posso mettere il tutto in un not page.ispostback in quanto questo caricamento me lo deve fare sempre

Ciò che mi stai consigliando tu è di mettere praticamente oMatriceascx.inzializzoMatrice(oMatrice.idMatrice, idUtente, annoRiferimento) nel load della pagina??? e poi quando parli di ID parli di Identificativo dello usercontrol o dei controlli suoi interni?

rossimarko Profilo | Guru

Devi separare le logiche di creazione dei controlli da quelle di popolamento. E' giusto creare i controlli ad ogni init della pagina, ma il popolamento va fatto solo nel not page.ispostback, così quando poi premi il pulsante i dati vengono presi automaticamente dal viewstate.

Quindi Page_init:
- controllo = loadcontrol("")
- controllo.id = "idcontrollo"
- controllocontenitore.controls.add (controllo)


page_load
if not page.ispostback
controllo = page.findcontrol("idcontrollo")
controllo.text = "pippo"
end if


Purtroppo non riesco a farti un esempio pratico con codice vero perchè non ho visual studio in questo momento, comunque se non riesci cerco di farti un esempio più dettagliato


-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko
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 !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5