35 messaggi dal 27 maggio 2008
Salve Ragazzi, ho la necessita di creare dei mini form dinamici a runtime contenenti oggetti quali TextBox, checkbox e DropdownlList, a seconda di quello che il navigatore sceglie.

Per farvi un esempio pratico, sto gestendo le attività effettuate da dei rappresentati sui loro clienti.

Se il rappresentante clicca su "Contattato" per indicare che ha contattato un cliente, nella pagina asp devo visualizzare 2 Textbox e una dropdownlist, ma può anche aggiungere che dopo averlo contattato si è recato da questo cliente, quindi se clicca su "Incontro" sotto al form "Contattato" vado ad aggiungere questo altro form con 3 textbox e un checkbox.

In pratica sto creando una specie di Agenda, che in base a delle mansioni visualizza i campi personalizzati per il tipo di mansione.

Ho pensato ci creare ciò, creando a runtime dei PANEL contenenti Gli oggetti giusti secondo la mansione scelta.

Il problema è che alla prima scelta il PANEL popolato viene creato correttamente, ma alle successive scelte mi ritrovo solamente l'ultimo panel creato e quelli precedenti non vengono ricreati dalla pagina dopo il postback.

So che potrei gestire questa situazione tramite i VIEWSTATE, ed infatti ho provato ad utilizzarli passandogli l'intero PANEL Creato in quel momento per poi ricaricarlo al postback, ma la pagina mi restituisce un Errore :

Il tipo 'System.Web.UI.WebControls.Panel' nell'assembly 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' non è contrassegnato come serializzabile.

La domanda è, come mai questo errore ? Come posso gestire al meglio, secondo voi, questa mia esigenza ?
11.886 messaggi dal 09 febbraio 2002
Contributi
Alex84bb ha scritto:

quelli precedenti non vengono ricreati dalla pagina dopo il postback.


ciao, è normale: i controlli generati dinamicamente vanno ricreati e ri-aggiunti alla pagina ad ogni postback. E' bene eseguire questa operazione nell'evento PreInit della pagina oppure, se stai usando una MasterPage, nell'evento Init della pagina.

Alex84bb ha scritto:

Il tipo 'System.Web.UI.WebControls.Panel' nell'assembly 'System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' non è contrassegnato come serializzabile.

Questo succede perché non può essere creata una rappresentazione stringa dell'oggetto Panel e quindi il ViewState che client-side è una stringa, non può "ospitarlo". Poco male perché come detto poco fa puoi ricreare i controlli e, anzi, è meglio così se no il ViewState crescerebbe a dismisura.

Immagino che tu abbia accesso alle informazioni "Contattato" o "Incontro" anche al postback, quindi in base a quelle sai sempre quali controlli devi ricreare e perciò puoi anche fare a meno del ViewState.

Se invece non avessi accesso a quelle informazioni, puoi pur sempre memorizzarle in un campo <asp:HiddenField e poi recuperarle al postback con un Request.Form["nomeHiddenField"]. Infatti tieni a mente che gli eventi PreInit o Init in cui dovresti ricreare i controlli, si verificano presto nel ciclo di vita della pagina e in quel momento il ViewState non è ancora stato caricato. Se vuoi passarti delle "istruzioni" su come ricreare i controlli devi necessariamente usare la collezione Request.

In ultimo ti consiglierei di raggruppare le 2 Textbox corrispondenti a "Contattato" in uno user control, e le altre 3 Textbox di "Incontro" in un altro user control. Così è più semplice e il codice della pagina resterà più pulito perché ad ogni "azione" corrisponde sempre un solo controllo.

ciao

Enjoy learning and just keep making
35 messaggi dal 27 maggio 2008
Ti ringrazio per i consigli, ora provo a metterli in pratica ! ;)
35 messaggi dal 27 maggio 2008
Ho messo in pratica gli User control e fin qui ci siamo.

Volevo sapere, riguardo al Postback, il salvataggio dei valori inseriti negli oggetti presenti nei user control e degli user control stessi, l'unica soluzione è salvare ogni valore di questi oggetti nei campi HIDDEN ?

Per esempio, se la pagina prima del postback ha un user control aggiunto dinamicamente, la soluzione migliore è incrementare un contatore che conta quanti user control ci sono prima del postback, cosi che io li ricreo al refresh della pagina, o ci sono altre soluzioni più eleganti?
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

Alex84bb ha scritto:

l'unica soluzione è salvare ogni valore di questi oggetti nei campi HIDDEN ?


no, non devi copiare i valori nei campi hidden perché nel momento in cui ri-aggiungi gli user controls, le textbox al loro interno saranno in grado di recuperare autonomamente il valore dalla collezione Request.Form. In pratica:
  • Aggiungi dinamicamente degli usercontrols alla pagina
  • L'utente digita del testo nelle textbox contenute negli usercontrols e invia il form
  • Ri-crei gli usercontrols nello stesso ordine in cui li avevi creati al punto 1
  • I valori digitati dall'utente appariranno automaticamente nelle textbox


Il problema, mi sembra di aver capito, è quello del terzo punto ossia capire come ricreare gli stessi usercontrols dopo che l'utente ha inviato il form.

Puoi ricavare questa informazione in un paio di modi:
  • Se nella pagina hai delle checkbox tipo "Contattato" e "Incontro", allora puoi recuperare il loro valore dalla collezione Request.Form. Ricorda che non puoi recuperare lo stato di una checkbox usando la proprietà nomeCheckbox.Checked perché all'evento PreInit i dati del post e il viewstate non sono ancora stati analizzati.
  • Oppure, quando crei gli usercontrols per la prima volta, annota in un campo hidden i nomi di tali usercontrols. Una cosa tipo: "Contattato,Incontro". Al postback, leggi il valore di quel campo hidden dalla collezione Request.Form e ricrea gli usercontrols di conseguenza. Potresti anche fare a meno di usare un campo hidden perché Request.Form è una collezione di chiavi e valori e potresti determinare quanti e quali usercontrols erano presenti semplicemente osservando i nomi delle chiavi


ciao

Enjoy learning and just keep making
35 messaggi dal 27 maggio 2008
BrightSoul ha scritto:
ciao,

Alex84bb ha scritto:

l'unica soluzione è salvare ogni valore di questi oggetti nei campi HIDDEN ?


no, non devi copiare i valori nei campi hidden perché nel momento in cui ri-aggiungi gli user controls, le textbox al loro interno saranno in grado di recuperare autonomamente il valore dalla collezione Request.Form. In pratica:
  • Aggiungi dinamicamente degli usercontrols alla pagina
  • L'utente digita del testo nelle textbox contenute negli usercontrols e invia il form
  • Ri-crei gli usercontrols nello stesso ordine in cui li avevi creati al punto 1
  • I valori digitati dall'utente appariranno automaticamente nelle textbox


Il problema, mi sembra di aver capito, è quello del terzo punto ossia capire come ricreare gli stessi usercontrols dopo che l'utente ha inviato il form.

Puoi ricavare questa informazione in un paio di modi:
  • Se nella pagina hai delle checkbox tipo "Contattato" e "Incontro", allora puoi recuperare il loro valore dalla collezione Request.Form. Ricorda che non puoi recuperare lo stato di una checkbox usando la proprietà nomeCheckbox.Checked perché all'evento PreInit i dati del post e il viewstate non sono ancora stati analizzati.
  • Oppure, quando crei gli usercontrols per la prima volta, annota in un campo hidden i nomi di tali usercontrols. Una cosa tipo: "Contattato,Incontro". Al postback, leggi il valore di quel campo hidden dalla collezione Request.Form e ricrea gli usercontrols di conseguenza. Potresti anche fare a meno di usare un campo hidden perché Request.Form è una collezione di chiavi e valori e potresti determinare quanti e quali usercontrols erano presenti semplicemente osservando i nomi delle chiavi


ciao



Non so quanto ringraziarti, sei stato davvero gentilissimo, ora mi è tutto chiaro, vorrei approfittarne per risolvere una cosa strana...

Ho fatto l'user control con un button per poter eliminare ogni user control aggiunto se l'utente ne ha bisogno, poi ho fatto in modo che se clicco sul bottone dell'user control questo esegue del codice che sta sulla pagina .aspx.

Se aggiungo il primo user control nella pagina .aspx questo viene creato e se vado a cliccare sul bottone per la rimozione mi scatena l'evento correttamente, ma se aggiungo il secondo User control, il bottone per la rimozione di quest'ultimo non va al primo click ma funziona al secondo click.

Praticamente funziona dopo che la pagina ha eseguito il postback al primo click sul button del secondo User control aggiunto.

Ho anche lo stesso problema con il recupero dei valori nelle textbox dove tu mi dicevi che li recupera autonomamente, in effetti per il primo user control aggiunto funziona bene, infatti quando vado ad aggiungere il secondo il primo viene automaticamente ricreato e ricaricato con i valori esatti nelle textbox, ma se aggiungo il secondo user control, riempio le textbox e poi aggiungo un terzo user control il secondo viene ricreato ma vuoto...

Come mai ?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, prego :)

posta il codice che esegui al click sul bottone per la rimozione, e posta anche quello che usi per aggiungere uno usercontrol. Adesso senza poter vedere il codice mi resta difficile darti un consiglio preciso. Ad ogni modo:

Alex84bb ha scritto:

se aggiungo il secondo User control, il bottone per la rimozione di quest'ultimo non va al primo click ma funziona al secondo click.


Al click sul bottone dovresti rimuovere lo usercontrol che avevi aggiunto al PreInit, in modo che non appaia più nella pagina.


Alex84bb ha scritto:

se aggiungo il secondo user control, riempio le textbox e poi aggiungo un terzo user control il secondo viene ricreato ma vuoto...


mmh, forse il secondo usercontrol non assume lo stesso ID quando viene ricreato? Dovresti dare tu esplicitamente un ID ad ogni usercontrol che viene creato e aggiunto alla pagina e dovresti assicurarti che questo ID sia sempre lo stesso dopo ogni postback di pagina. Esempio:

Control c = Page.LoadControl("usercontrols/contattato.ascx");
c.Id = "Contattato"; //qui gli fornisco io un ID
contenitore.Controls.Add(c);


Quindi ispeziona l'html prodotto dalla pagina asp.net e verifica che le textbox contenute negli usercontrols mantengano gli stessi rispettivi ID di postback in postback.

ciao
Modificato da BrightSoul il 15 dicembre 2011 22.41 -

Enjoy learning and just keep making
35 messaggi dal 27 maggio 2008
Rigrazie di nuovo !! :) il problema l'ho risolto proprio dandogli l'ID manualmente ! Se capiti dalle parti di Perugia sta sicuro che hai un aperitivo pagato ;)!
Modificato da Alex84bb il 16 dicembre 2011 15.29 -

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.