LstView e creazione di controlli dinamici

mercoledì 18 gennaio 2012 - 17.46
Tag Elenco Tags  C#  |  .NET 3.5  |  .NET 4.0  |  Visual Studio 2010

andrestu Profilo | Expert

Salve a tutti,
utilizzando un controllo ListView ho la necessità di creare dinamicamente dei controlli in base al contenuto di dati del datasource collegato al ListView stesso.
L'evento più indicato per poter effettuare questa operazione sembra essere 'OnItemDataBound', quindi all'interno dell'evento si accede al ListViewDataItem che contiene i dati e i vari controlli inseriti nel ItemTemplate del ListView.
Il 'problema' è che se non eseguo manualmente ad ogni postback il metodo DataBind() del controllo ListView, perdo i controlli creati dinamicamente, quindi, per ovviare sono costretto a chiamare il DataBind ad ogni postback.
Potrei anche farlo senonchè succede che se sto editando un Item ed eseguo il postback i dati mi ritornano quelli del datasorce come normale che sia.
Faccio un esempio per essere più chiaro.

passo 1 - lancio la mia pagina aspx, nell'evento PreRender (oppure LoadComplete) faccio il databind quindi all'interno dell'evento OnItemDataBound creo i controlli dinamicamente in base ai dati del datasource

passo 2 - entro in modalità editing - a questo punto mi trovo uno dei Item in modalità di edit, quindi vado a cambiare per esempio il contenuto di una textbox al suo interno

passo 3 - se a questo punto faccio un postback (e non esco dalla modalità di editing) la mia textbox mi ritorna con i dati originali, questo è normale perchè ad ogni postback la mia pagina esegue il databind

diciamo che il problema lo risolvo non eseguendo il databind ad ogni postback e per i controlli che devono essere creati dinamicamente si creano nell'evento ItemCreated, il punto è che manualmente devo andare a cercare i dati alla sorgente per poter creare i controlli dinamicamente...

Voui come vi comportate in questo contesto?


Andrea Restucci - Web Developer

martinez Profilo | Senior Member

Non ti è possibile utilizzare l'evento: ListView.ItemCreated per gestire i tuoi controlli aggiuntivi?

Se magari fai capire meglio quel'è il problema e/o cosa devi fare forse si trova una soluzione migliore.

Ciao

andrestu Profilo | Expert

be come ho detto in precedenza devo creare dei controlli in base ai dati letti, per esempio un numero di immagini variabil, se sono all'interno dell'evento ItemCreated non posso accedere ai dati sottostanti ammenochè non faccio una lettura diretta alla sorgente dati...

Andrea Restucci - Web Developer

martinez Profilo | Senior Member

>be come ho detto in precedenza devo creare dei controlli in base
>ai dati letti, per esempio un numero di immagini variabil, se
>sono all'interno dell'evento ItemCreated non posso accedere ai
>dati sottostanti

io credo che tu possa risalire ai dati dell'item e poi manipolarlo come credi così:

protected void ListView1_ItemCreated(object sender, ListViewItemEventArgs e) { ListViewDataItem currentItem = (e.Item as ListViewDataItem); // Usiamo sempre lo stesso esemplio dei DB di SQL :) Employee emp = (Employee) currentItem.DataItem; if (emp == null) return; // Puoi fare qui tutto quello che serve oppure no? }

forse un aiuto maggiore lo trovi qui: http://msdn.microsoft.com/it-it/magazine/cc500643.aspx riferito alla costruzione di un menu ...

Ho capito male?
Ciao

andrestu Profilo | Expert

no hai capito bene solo che c'è una precisazione da fare.
l'evento itemcreated viene chiamato ad ogni postback quindi sempre, anche quando il controllo che visualizza i dati non fa il databind, in questa eventualità il dataitem restituito è senza dati all'interno. Ed è qui che sorge il problema perchè avrei dei controlli creati dinamicamente solo quando faccio il databind, quindi non ad ogni postback.
Il databind viene chiamato quando effettui un cambio pagina o esegui altri comandi tipo select ,delete o update.
Comunque diciamo che ho parzialmente risolto salvandomi in session al primo richiamo della pagina i dataitem interessati e recuperandoli all'interno dell'evento itemcreated.
L'unica cosa è che diventa un pò macchinoso gestire il tutto...

Andrea Restucci - Web Developer

martinez Profilo | Senior Member

Ciao!
Sparo l'ultima e poi mi fermo perché non riesco a trovare alternative ...

potresti creare una listView annidata per gestire i dati da creare in base all'item ??? ad esempio un annidamento che prelevato il valore del campo X ritorni le immagini relative a quel dato campo nella seconda listview?

mi spiace di non poter aiutare oltre ...

andrestu Profilo | Expert

grazie per la risposta, per ora rimango con la soluzione descritta prima, diciamo che alla fine il 'problema' (se così si può definire) si può aggirare in diversi modi.
il post lho aperto giusto per avere un riscontro da altri utenti...

Andrea Restucci - Web Developer

martinez Profilo | Senior Member

OK allora speriamo in altri contributor :)

Grazie a te e ciao
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5