[C#] Problema uso generics

martedì 07 ottobre 2008 - 22.07

caido87 Profilo | Newbie

Salve, mi sono appena registrato ed ho subito bisogno di una mano da chi se ne intende piu di me:)
Allora, devo fare per un esame universitario un progetto in c#. Devo creare un piccolo programa per gestire un hotel (prenotazioni, clienti, camere).
Il mio problema è che dovrei usare i generics per aggiornare ad esempio i datagridview e mi sto arenando.
Ho creato una classe con i generics e vorrei inserirci all'interno dei metodi per ad esempio fare un refresh, solo che non capisco proprio come strutturare il metodo. Il metodo non generics era questo:

<code>
public DataGridView visLista(DataGridView b, List<room> stanze)
{
for (UInt16 i = 0; i < stanze.Count; i++)
{
b.Rows.Add((stanze[i] as room).stringaDati());
}
return b;
}
</code>
dove stringaDati() è un metodo della classe room che restituisce un vettore di stringhe. Come posso modificarla per i generics?
Grazie mille!

freeteo Profilo | Guru

ciao,
non so esattamente cosa intendi per "aggiornare una datagridview" ma semplicemente puoi agganciare la tua collection di oggetti, come "DataSource" della Gridview, in maniera semplicissima:

dataGridView1.DataSource = stanze;

a questo punto la griglia visualizzerà tutte le proprietà dei singoli oggetti "room" che compongono la collection stanze.
La cosa è semplicissima, ed è anche intuitiva.

Se quello che vuoi fare poi è dare un dettaglio fatto di controlli per i singoli valori (come textbox/datetpicket etc...) associate ai vari campi della riga corrente, allora ti consiglio di usare un bindingnavigator e associare tramite DataBindings i vari controlli.
Quest'ultimo passaggio lo puoi fare in maniera totalmente "visuale", ti basta:
- apri la finestra "dataSource" dal menu di visual studio
- aggiungi un nuova->tipo oggetto->scegli la classe "room"
- adesso ti compare in questa finistra datasource, un nodo che puoi espandere e che ha le proprietà della classe
- se trascini sulla form il singolo campo, ti viene creato un controllo
- se trascini il nodo principale "room" ti viene fatto automaticamente una griglia

come vedi è molto semplice:

800x600 632Kb


Ti lascio qualche link di riferimento da cui partire:
http://www.csharpfriends.com/quickstart/winforms/default.aspx
http://msdn.microsoft.com/en-us/library/aa984099(VS.71).aspx

ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

caido87 Profilo | Newbie

Ciao, prima di tutto grazie mille per la risposta.
La cosa non è così semplice....dato che si tratta di un progetto per un esame devo rispettare delle richieste (anche se ovviamente non sono le scelte migliori/piu semplici).Conosco i dataset, ma io non posso usarli in questo ambito.
Praticamente, ho 4 classi (room, floor, person, reservation), 4 liste statiche nella form principale. Dovrei creare una classe genericview<room o floor o person..ecc> che all'interno abbia metodi tipo: aggiorna datagridview da lista. Riesco a farlo se creo una classe per ogni oggetto, ma mi fermo dato che DEVO usare i generics. Help!:)

freeteo Profilo | Guru

>Ciao, prima di tutto grazie mille per la risposta.
>La cosa non è così semplice....dato che si tratta di un progetto
>per un esame devo rispettare delle richieste (anche se ovviamente
>non sono le scelte migliori/piu semplici).Conosco i dataset,
>ma io non posso usarli in questo ambito.
forse hai frainteso, i dataset non li usi, usi proprio le tue classi (infatti fai riferimento ad un "object" come vedi dalla gif animata).


>Praticamente, ho 4 classi (room, floor, person, reservation),
>4 liste statiche nella form principale. Dovrei creare una classe
>genericview<room o floor o person..ecc> che all'interno
>abbia metodi tipo: aggiorna datagridview da lista.
ok forse adesso ho capito cosa devi fare, tu devi farti una collection<T> che abbia il metodo che ti riempia la grdiview.

Ecco un esempio codice che lo fa:
//--- il "where" ti obbliga a crearla con un oggetto //--- altrimenti potresti farla anche con int,string etc... public class Collezione<T> where T:class { //--- uso un IEnumerable<T> perchè più generico (va bene anche con array ad esempio) //--- ma potresti tipizzarti di più mettendo List<T> etc... public void CaricaGriglia(DataGridView griglia, IEnumerable<T> collezione) { //--- qui puoi fare un ciclo foreach ad esempio... //--- ma la cosa più banale è proprio impostare la DataSource //--- così la griglia si arrangia a fare tutto griglia.DataSource = collezione; } }
e poi dal tuo programma la richiami con:
//--- uso "room" ma vale per tutte le tue classi Collezione<room> coll = new Collezione<room>(); coll.CaricaGriglia(... , ...);
se invece la vuoi statica, allora puoi firmarla statica e non ti serve creare la variabile "coll", ma tipizzata, richiami il metodo che ti serve.

Come vedi, il fatto di usare generics, è tutto nella dichiarazione di un tipo "T" che appunto non viene definito nella definizione della classe, ma viene definito dopo, quando la usi.
Quindi ha una funzione generica, ovvero lo puoi usare in vari contesti.
La "constraint" viene data dal "where" questo è ovviamente opzionale, ma ti aiuta a "scremare" i tipi con cui funziona la tua classe...la cosa è veramente utile, spessissimo infatti ti permette di migliorare il tuo codice riciclandolo molto, evitando però errori a runtime, inquanto i tipi sono controllati in fase di compilazione.

Un paio di link utili:
http://msdn.microsoft.com/it-it/library/512aeb7t.aspx
http://msdn.microsoft.com/en-us/vs2005/aa718334.aspx ( ci sono esempi anche su generics)
http://www.15seconds.com/issue/031024.htm
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

caido87 Profilo | Newbie

Grazie Grazie Grazie Grazie!! Quasi risolto...intanto mi ha fatto parecchio comodo mettere il where nella definizione...Sono riuscito a fare dei metodi, ora provo con il datasource come mi hai consigliato. Comunque...GRAZIE!:)

freeteo Profilo | Guru

>Grazie Grazie Grazie Grazie!! Quasi risolto...intanto mi ha fatto
>parecchio comodo mettere il where nella definizione...
ok, ottimo Accetta una risposta se sei riuscito a fare, così marchiamo il thread come risolto.

>Sono riuscito a fare dei metodi, ora provo con il datasource come mi hai consigliato.
ok fammi sapere.


ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5