GidView, Binding ad una lista di oggetti che contengono delle liste.

martedì 18 settembre 2012 - 12.32
Tag Elenco Tags  C#  |  .NET 4.0  |  Visual Studio 2010  |  Internet explorer 8.0

Pomp92 Profilo | Newbie

Ciao a tutti,
Sono giunto qui in cerca d'aiuto..

Mi capita spesso di dover visualizzare griglie con un numero variabile di colonne.
In questo caso ho una List<RowTabellaConcentrazioneGiornaliera>.

Nella mia tabella voglio visualizzare le seguenti colonne:
- DataString
- StatoImpianto
più le seguenti due colonne per ogni elemento della lista List<MisuraConcentrazione> Misure
- STRMediaOraTQ
- STRMediaOraNorm

Ecco come sono fatte le due classi:
public partial class RowTabellaConcentrazioneGiornaliera { public DateTime Data { get; set; } public string DataString { get; set; } public List<MisuraConcentrazione> Misure { get; set; } public string StatoImpianto { get; set; } } public partial class MisuraConcentrazione : FormattableNumber { public double MediaOraTQ { get; set; } public string STRMediaOraTQ {[.....]} public double MediaOraNorm { get; set; } public string STRMediaOraNorm {[.....]} public double ID { get; set; } public string STRID {[.....]} public string IVTQ { get; set; } public string IVN { get; set; } public string MeasureCod { get; set; } public string DescrizioneParametro { get; set; } }

Qualche soluzione rapida? Ho provato a usare dei TemplateField mettendoci dentro una nuova griglia con le due colonne che mi servivano ma non funziona. Se c'è una soluzione più pratica benvenga, altrimenti ditemi che vi posto il codice di quel template.

Grazie mille in anticipo!
Ciao..

andrestu Profilo | Expert

io inserirei un gridview all'interno del template del primo gridview, un gridview dentro l'altro per capirci...

Andrea Restucci - Web Developer

Pomp92 Profilo | Newbie

avevo fatto un tentativo da codice ma non mi era riuscito... Quando eseguo non mi da nessun errore, appaiono le colonne nella gridview principale ma sono vuote, non contengono nulla, neppure la seconda griglia vuota.

Hai qualche esempio gia' fatto?

Eco quei cosa avevo scritto:

Template della cella che dovrà contenere la griglia:
public partial class ColonnaMisureParametroConcentrazione : ITemplate { public MisuraConcentrazione _MisuraConcentrazione { get; set; } // Implementation of ITemplate public void InstantiateIn(System.Web.UI.Control container) { // Create a grid GridView Grid = new GridView(); //creo le colonne BoundField NewColonnaID = new BoundField(); NewColonnaID.HeaderText = "Ind. Disp."; NewColonnaID.DataField = "this._MisuraConcentrazione.ID"; Grid.Columns.Add(NewColonnaID); BoundField NewColonnaValueTQ = new BoundField(); NewColonnaValueTQ.HeaderText = "Valore TQ"; NewColonnaValueTQ.DataField = "_MisuraConcentrazione.MediaOraTQ"; Grid.Columns.Add(NewColonnaValueTQ); BoundField NewColonnaIVTQ = new BoundField(); NewColonnaIVTQ.HeaderText = "Validità TQ"; NewColonnaIVTQ.DataField = "_MisuraConcentrazione.IVTQ"; Grid.Columns.Add(NewColonnaIVTQ); BoundField NewColonnaValueN = new BoundField(); NewColonnaValueN.HeaderText = "Valore N"; NewColonnaValueN.DataField = "_MisuraConcentrazione.MediaOraNorm"; Grid.Columns.Add(NewColonnaValueN); BoundField NewColonnaIVN = new BoundField(); NewColonnaIVN.HeaderText = "Validità N"; NewColonnaIVN.DataField = "_MisuraConcentrazione.IVN"; Grid.Columns.Add(NewColonnaIVN); // Make the grid appear // in the column container.Controls.Add(Grid); } }


Codice che aggiungeva i TemplateField alla GridView:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Grazie.. :)

andrestu Profilo | Expert

scusa ma stai parlando di gridview utilizzati in aspnet ?
in tal caso mi sembra di capire che le colonne sono variabili ma non dinamiche e cioè variano sempre entro un range di tipi di colonna prestabilito.
A questo punto allora conviene che crei il tutto completo di tutte le colonne nella pagina aspx tramite il webcontrol gridview poi nell'evento databind disabiliti le colonne che non vuoi far vedere, così ti eviti tutto il meccanismo di inserimento manuale da codice...

Andrea Restucci - Web Developer

Pomp92 Profilo | Newbie

Si sto parlando di un controllo gridview in una pagina asp.net.
In pratica io ho sempre due colonne (ora e statoImpianto) più dei "gruppi" da 5 colonne, un gruppo per ogni elemento della lista "misure".
Non so a priori il numero massimo di elementi nella lista misure, potrebbe essere uno solo come 20. :(

andrestu Profilo | Expert

allora, nella pagina aspx crei un gridview "master" (lo chiamo master per farmi capire) e nel template dell'item di questo gridview "master" inserisci un altro gridview, poi in entrambi aggiungi le colonne statiche (se in quello interno ci sono solo colonne dinamiche allora non inserisci niente), a questo punto utilizzi gli eventi del gridview "master" per accedere al gridview interno e creare colonne dinamiche. Se per creare queste colonne dinamiche hai bisogno di accedere ai valori dei dati di una riga allora utilizzi l'evento itemdatabound del gridview master altrimenti le puoi creare anche nell'evento ...created (ora non ricordo bene il nome). non so se mi sono spiegato.
se per esempio hai un data source con dati del tipo :

record_1 (o riga 1 per capirci) Nome = andrea , Età = 30
record_2 (o riga 2 per capirci) Nome = gianni, Età = 54

e per esmpio devi creare delle colonne dinamiche in base all'età di ogni utente, lo puoi fare sfruttando l'evento itemdatabound del gridview master, dove puoi leggere l'età della riga in questione e creare controlli dinamicamente, ovviamente dovrai anche cercare tramite il metodo findcontrol il gridview interno e poi inserirgli dinamicamente le colonne, tutto questo sempre all'interno dell'evento itemdatabound.
Ho utilizzato un esempio banale perchè non conosco il dettaglio della tua struttura ma il concetto è lo stesso qualsiasi struttura utilizzi.

Andrea Restucci - Web Developer

Pomp92 Profilo | Newbie

Grazie mille Andrea, ora ci provo.

Gluck74 Profilo | Guru

puoi lavorare molto bene con i repeater o il ListView.
ad esempio per il repeater:

prima cosa cerchi l'elemento (RowTabellaConcentrazioneGiornaliera) con Misure più lunghe per vedere il massimo delle colonne da fare (MaxCol)
tu sai che la tabella inizia sempre allo stesso modo, pure la riga, quindi:
<table> per ogni elemento in RowTabellaConcentrazioneGiornaliera <tr> <td>DataString</td><td>StatoImpianto</td> per ogni elemento in Misura (e fino a MaxCol) <td>STRMediaOraTQ</td><td>STRMediaOraNorm</td> </tr> </table>

vedi che questo simil codice spiega brevemente cosa dovresti fare. Guardandolo bene è esattamente quello che fa un repeater.
In questo caso sono due repeater uno dentro l'altro, il secondo ha la proprietà DataSource bindata così:
<asp:repeater ID="..." runat="server" dataSource='<%# Eval("Misure") %>' />

Il repeater non è difficile da usare, prova, se poi non ci riesci vedo di ritagliare 10 minuti per farti un esempio.

ciao
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.
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