Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

ADO.NET Data Services: un client con Silverlight 2.0 e Visual Basic 2008

Nei vari articoli dedicati agli ADO.NET Data Services, pubblicati su Visual Basic Tips & Tricks, abbiamo visto diverse tipologie di applicazioni client (WPF, Windows Forms, Console) lato Windows. Ma, come sappiamo, le client libraries possono essere anche applicazioni Web e in quest’ottica si inseriscono le applicazioni Silverlight, che possono consumare gli ADO.NET Data Services e fungere da client.

 

In questo post, quindi, creeremo un client con Silverlight e Visual Basic 2008, prendendo come base il nostro consueto servizio NorthwindService che abbiamo creato nel primo articolo della serie. Probabilmente per alcuni di voi sarà anche l’occasione per un primo contatto con Silverlight 2.0 in Microsoft Visual Studio 2008.

 

È questo un tipo di tutorial abbastanza diffuso in Internet, ma da quel che ho visto per Visual Basic non c’è poi molto pertanto può essere interessante proporlo in quest’ottica, anche aggiungendo un discorso di rappresentazioni master-details.

 

Prerequisiti necessari prima di proseguire nella lettura: aver installato il plug-in di Silverlight 2.0 e i tools per Visual Studio 2008.

 

Se abbiamo già tutto, riapriamo la soluzione contenente il servizio. Aggiungiamo alla soluzione un nuovo progetto (File|Add|New project) e selezioniamo la subfolder Silverlight nella cartella dei template di Visual Basic, assegnando al nuovo progetto il semplice nome di SilverlightClient:

 

 

 

Quando fate clic su OK, dopo alcuni secondi compare la seguente figura:

 

 

 

Qui, in sostanza, ci viene chiesto come ospitare il controllo utente Silverlight che svilupperemo poi. Le possibilità sono: aggiungere una nuova applicazione Web ASP.NET, far generare una pagina di test in formato Html, oppure collegare il controllo utente Silverlight a un’applicazione Web esistente (soluzione proposta di default). Lasciamo quindi invariate le impostazioni proposte, di modo che Silverlight lavori con l’applicazione Web esistente per evitare problemi di cross domain.

 

Dopo alcuni secondi il progetto che espone il servizio viene aggiornato con i file di javascript e le pagine Web create appositamente per lavorare col controllo utente, che viene definito nel nuovo progetto per Silverlight che potete vedere in Solution Explorer:

 

 

Nota bene: il progetto di avvio deve rimanere quello che espone il servizio e non il client Silverlight.

 

Quello che probabilmente vi balzerà subito all’occhio se non avete mai lavorato con Silverlight, è sicuramente la presenza di due file di codice XAML (App.Xaml e Page.Xaml), in modo analogo alle applicazioni WPF. Silverlight, infatti, è in realtà un sottoinsieme di WPF specifico per il Web e questo è un grande vantaggio per noi developer poichè una volta che sappiamo come muoverci in WPF, iniziare a capire Silverlight non sarà difficile (anche se, come ovvio, c’è il discorso del networking e ci sono delle differenze a livello di architettura e quindi di comportamento di alcuni oggetti).

 

Il passaggio successivo è l’aggiunta di un riferimento al servizio, come già sapete fare avendo letto i precedenti articoli:

 

 

 

Lo scopo della nostra applicazione client sarà quello, molto semplice, di mostrare l’elenco dei clienti del database Northwind e dei rispettivi ordini ogni qual volta viene selezionato un cliente. A tal proposito possiamo utilizzare uno speciale controllo di Silverlight, che è la DataGrid. Ma per poterlo utilizzare dobbiamo aggiungere un riferimento all’assembly System.Windows.Controls.Data.dll:

 

 

 

Ora abbiamo la base per lavorare. Possiamo, per esempio, definire due DataGrid sull’interfaccia, una per la parte master e una per la parte details. Il tutto può avvenire tramite codice XAML, in un modo decisamente familiare a chi ha già avuto modo di sviluppare in WPF. Qui non avremo una Window ma una Page, al cui interno viene definito uno UserControl che sarà poi incapsulato nella pagina Web. Dopo aver fatto doppio clic sul file Page.Xaml, questo è il codice XAML che ci occorre:

 

<UserControl x:Class="SilverlightClient.Page"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"

    Width="800" Height="600">

   

    <Grid x:Name="LayoutRoot" Background="White">

        <Grid.RowDefinitions>

            <RowDefinition Height="400"/>

            <RowDefinition/>

        </Grid.RowDefinitions>

       

        <data:DataGrid x:Name="CustomersDataGrid" ItemsSource="{Binding}"

                       Grid.Row="0" RowBackground="LightBlue"

                       AutoGenerateColumns="True"

                       AlternatingRowBackground="Azure" Margin="10">

           

        </data:DataGrid>

       

        <data:DataGrid x:Name="OrdersDataGrid" ItemsSource="{Binding}"

                       Grid.Row="1" RowBackground="LightBlue"

                       AutoGenerateColumns="True"

                       AlternatingRowBackground="Azure" Margin="10"/>

    </Grid>

</UserControl>

 

Come potete vedere, il codice non è particolarmente complesso. Oltre a ridimensionare il controllo, abbiamo aggiunto un namespace Xml chiamato data in modo da poter utilizzare anche da XAML i controlli esposti dall’assembly System.Windows.Controls.Data.dll. Le due DataGrid sono implementate in modo molto semplice e le relative proprietà si spiegano da sole. La ItemsSource, in particolare, è quella che, una volta assegnata, popola il controllo e l’utilizzo della markup extension {Binding} sta ad indicare che la stessa sarà popolata a runtime da codice Visual Basic tramite data-binding.

 

Ora passiamo al code behind, Page.xaml.vb. In primo luogo, aggiungiamo le seguenti direttive Imports:

 

Imports SilverlightClient.NorthwindServiceReference

Imports System.Windows.Browser  'mi occorre per recuperare l'Uri chiamante

Imports System.Data.Services.Client

 

Ora, all’interno della classe Page digitiamo il seguente codice:

 

    Private NorthwindContext As NORTHWNDEntities

 

    Public Sub New()

        InitializeComponent()

 

        'Ottengo l'istanza del contesto, nel modo consueto

        NorthwindContext = New NORTHWNDEntities(New Uri(HtmlPage.Document.DocumentUri, "Northwind.svc"))

 

        'Ottengo l'elenco dei clienti e dei relativi ordini tramite eager loading

        Dim AllCustomers = NorthwindContext.Customers.Expand("Orders")

 

        AllCustomers.BeginExecute(New AsyncCallback(AddressOf LocalCallBack), AllCustomers)

    End Sub

 

Innanzitutto notiamo l’utilizzo dell’oggetto HtmlPage.Document.DocumentUri per ottenere l’indirizzo del documento in cui è ospitato il controllo Silverlight (che poi corrisponde con quello che espone il servizio). Questo può tornare utile poiché riutilizzabile in altre applicazioni Silverlight, piuttosto che fare l’hard coding dell’URL del servizio.

 

Successivamente otteniamo l’elenco dei clienti e dei relativi ordini, in modo molto semplice. Il tipo di dato che otteniamo da questa query è un DataServiceQuery(Of Customers). DataServiceQuery è uno speciale tipo che supporta, tra l’altro, l’esecuzione di operazioni asincrone, tipiche in Silverlight.

 

Proprio perché in Silverlight le chiamate sono gestite in modo asincrono, è necessario ricorrere a un metodo di istanza chiamato BeginExecute, il cui primo argomento è un delegato da utilizzare quando l’operazione asincrona stessa è completata mentre il secondo argomento è costituito dalla DataServiceQuery.

 

Il codice del metodo LocalCallBack, che per l’appunto riceve come argomento lo stato dell’operazione asincrona, può essere implementato come segue:

 

    Private Sub LocalCallBack(ByVal result As IAsyncResult)

 

        Dim LocalNorthwindContext As DataServiceQuery(Of Customers) = _

                                     CType(result.AsyncState, DataServiceQuery(Of Customers))

 

        'Importante la conversione in List(Of T), altrimenti la DataGrid non visualizza nulla

        Me.CustomersDataGrid.ItemsSource = LocalNorthwindContext.EndExecute(result).ToList

    End Sub

 

In sostanza, si converte lo stato dell’operazione in una DataServiceQuery(Of Customers). Sul risultato di tale conversione si richiama il metodo EndExecute, che completa l’operazione asincrona. Il risultato ottenuto da EndExecute, ossia una IEnumerable(Of T), viene convertito con ToList e assegnato alla proprietà ItemsSource della DataGrid per popolarla.

 

Per popolare anche la griglia degli ordini di ciascun cliente, è sufficiente gestire l’evento SelectionChanged della prima DataGrid come segue:

 

    Private Sub CustomersDataGrid_SelectionChanged(ByVal sender As Object, _

                                  ByVal e As System.Windows.Controls.SelectionChangedEventArgs) _

                                  Handles CustomersDataGrid.SelectionChanged

 

        Dim CurrentCustomer As Customers = CType(Me.CustomersDataGrid.SelectedItem, Customers)

 

        OrdersDataGrid.ItemsSource = CurrentCustomer.Orders

 

    End Sub

 

Se ora proviamo ad avviare l’applicazione, e soprattutto se tutto è andato a buon fine, il risultato che otterremo a video sarà il seguente:

 

 

Vi basterà selezionare i vari clienti per ottenere nella griglia sottostante i relativi ordini. Ovviamente, la questione Data Services con Silverlight non si esaurisce in un contesto come questo. C’è tutto il discorso delle operazioni CRUD e del networking, ma ce ne occuperemo in post successivi.

 

Per il momento abbiamo visto come implementare un client Web di base con Microsoft Silverlight 2.0 e Visual Studio 2008 per ottenere dati da un ADO.NET Data Service.

 

Il codice sorgente a corredo del post è disponibile a questo indirizzo dell’area Download di Visual Basic Tips & Tricks.

 

Alessandro

Print | posted on giovedì 29 gennaio 2009 21:46 | Filed Under [ Visual Basic WCF Data Services/WCF RIA Services/OData ]

Powered by:
Powered By Subtext Powered By ASP.NET