in

dotNet Umbria [DNU]

Il primo User Group in Umbria sul mondo .Net

Articoli

Articoli vari degli iscritti a DotNetUmbria

Tutorial WPF & LINQ - Lezione 2 - Accesso al database tramite LINQ

Eccoci qui con la seconda lezione!
In questa lezione vedremo come creare in automatico delle classi di accesso al database sfruttando le potenzialità di LINQ to SQL quindi vedremo come creare una listview che prelevi i dati dalla nostra tabellina e li mostri a video. Tutto questo senza scrivere una sola riga di codice !!

4. Creazione di Classi LINQ to SQL

In Visual Studio, Microsoft mette a disposizione un tipo di file (dbml) che ci consente di creare le classi in modo visuale senza complicarci troppo la vita. Quindi cliccate con il pulsante destro sul progetto nella finestra di esplorazione progetti e seguite il percorso "Add -> New Item ... " e vi apparirà una finestra come questa:Inserimento di LINQ to SQL
dove selezionate "LINQ to SQL Classes" quindi date un nome al vostro file considerando che tutti i riferimenti poi sfrutteranno questo nome. Io ho messo "MyLinqToSQL.dbml".

Questa operazione aggiunge tutte le dipendenze necessarie per lavorare con LINQ to SQL se controllate sulle risorse infatti dovreste avere tra gli Assembly:

System.Data.LINQ
System.Xml.LINQ

Ora trascinate la vostra tabella "TIPI" dal "Server Explorer" all'area di lavoro (dovreste infatti avere il file MyLinqToSQL.dbml aperto in modalità Design). Se avete fatto tutto bene vi apparirà la vostra tabella nell'area di lavoro. Questa tabella è la rappresentazione grafica della classe "Tipi" creata in automatico da VS.
Ora salvate il file e chiudetelo visto che per il momento non ci serve più. L'area di lavoro torna al design della finestra Window1 del progetto.

5. Creazione della LISTVIEW

Per inserire controlli in una form WPF il mio consiglio è di utilizzare Expression Blend. Aprite Expression Blend (senza chiudere il progetto VS) e caricate il progetto TestWPFLinqToSql. Vi comparirà la vostra window1. Cercate il controllo ListView nella toolbar a sinistra (probabilmente dovrete aprire l'Asset Library cliccando sul pulsante ">>" quindi cercate ListView e fateci Click, verrà aggiunto alla toolbar) quindi fate doppio click su di esso e vedrete che vi si posizionerà in alto a sinistra. impostate i margini a 0,0,0,40 così da lasciare lo spazio per i futuri bottoni.

A questo punto andate nel pannello delle proprietà (sempre di expression studio) e se non vi da problemi di refresh potete scorrerlo fino a trovare "miscellaneous" che è una sezione compattata.
Cliccate su di essa e, sempre se non avete problemi di refresh, potete scorrerla fino a trovare "View" che è anch'essa una sezione compattata, sempre cliccandoci sopra la aprite e scorrete fino a trovare la voce "columns" che invece è una collezione per cui avrete un pulsantino con "..." scritto sopra.
Cliccateci e se tutto va bene dovrebbe comparirvi il "Collection Editor" delle colonne.
Create 1 colonna (l'altra già c'è) poi selezionate la prima e impostate la Proprietà "Header" in "Codice"
Selezionate la seconda e impostate la proprietà "Header" a "Descrizione".
Ora chiudete premendo OK.
Visto che probabilmente avrete problemi di refresh anche qui, vi consiglio di chiudere la finestra di design della Window1 e riaprirla dal pannello "Project".
otterrete una cosa simile a questa:

6. Associare i dati alla ListView

Ora comincia il bello.
Premete F5 e magicamente il programma si avvierà, correggete errori se ce ne sono ma credo che non ve ne siano.
Ora chiudete l'applicazione appena eseguita e selezionate il controllo ListView facendo doppioclick su esso dal pannello "Object and TimeLine" in modo tale che vi si evidenzi in giallo.
A questo punto cliccate con il pulsante destro sul controllo nel form e scegliete la voce "BindItemSourceToData" dal menu contestuale.
Premete sul pulsante "+ CLR" che trovate nella finestra che si è appena aperta e cliccate su "MyLinqToSQLDataContext" che dovreste avere nella lista (io avevo chiamato il file delle classi linq così: MyLinqToSQL.dmbl per cui il mio datacontext si chiama MyLinqToSQLDataContext)
Premete su "OK" e il datacontext verrà aggiunto alle connessioni "Data Sources", cliccateci sopra e vi apparirà nella colonna di destra, l'elenco degli oggetti che implementano l'interfaccia IObservableCollection (e qui non sono proprio sicuro, quindi la butto là così come mi viene e prendetela con beneficio di inventario) tra cui la classe "Tipis (Array):(Table Tipi)"
Selezionatela e premete Finish.
Sembra che non sia cambiato niente ma in realtà abbiamo appena detto che il compilatore XAML deve creare un'istanza di Tipis perché la ListView la deve usare come DataSource ed abbiamo detto alla ListView di usare quell'istanza come DataSource per i suoi DataItem.
passate dalla visualizzazione Design a quella XML, il Codice XAML ora è il seguente:

<Window
    xmlns="
http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="
http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="Window1"
    Title="Window1" Height="300" Width="300" xmlns:d="
http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:TestWPFLinqToSql="clr-namespace:TestWPFLinqToSql">
 <Window.Resources>
  <ObjectDataProvider x:Key="MyLinqToSQLDataContextDS" d:IsDataSource="True" ObjectType="{x:Type TestWPFLinqToSql:MyLinqToSQLDataContext}"/>
 </Window.Resources>
    <Grid>
     <ListView IsSynchronizedWithCurrentItem="True" Margin="0,0,0,40" ItemsSource="{Binding Path=Tipis, Mode=Default, Source={StaticResource MyLinqToSQLDataContextDS}}">
      <ListView.View>
       <GridView>
        <GridViewColumn Header="Codice"/>
        <GridViewColumn Header="Descrizione"/>
       </GridView>
      </ListView.View>
     </ListView>
    </Grid>
</Window>

Ora bisogna dire alle colonne quale valore prendere:
Qui il mio consiglio è di farlo a mano:

        <GridViewColumn Header="Codice" DisplayMemberBinding="{Binding Path=TipoCodice}"/>
        <GridViewColumn Header="Descrizione" DisplayMemberBinding="{Binding Path=TipoDescrizione}"/>

Purtroppo Expression Blend non ha intellisense e quello di VS si spegne proprio nel Binding per cui dovete sapere come si chiamano le colonne della tabella, le mie si chiamano TipoCodice e TipoDescrizione.
ora compilate ed eseguite premendo F5. se avete messo dei valori di prova nella tabella dovreste vederli nella listview.
Tutto questo ancora una volta senza scrivere nessuna riga di codice se non per effettuare il Binding alle colonne. spero che questa limitazione venga al piu presto sorpassata (io sto utilizzando VS2008 SP1 e Blend 2.5 March CTP).

Con questo abbiamo chiuso la Lezione 2, arrivederci alla prossima lezione dove vedremo come permettere la modifica dei valori direttamente da listview.
Vi lascio in allegato lo screenshot di quello che è venuto fuori.
Only published comments... Jun 06 2008, 03:32 PM by dardino
dotNet Umbria 2007-2008
Powered by Community Server (Commercial Edition), by Telligent Systems