Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1908, 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

Disabilita cookie ShinyStat

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

WPF: Un primo sguardo alla DataGrid con VB 2008

In un post di pochi giorni fa ho comunicato la release della prima versione del WPF Toolkit, un insieme di controlli aggiuntivi per WPF in Visual Studio 2008 Service Pack 1, che arricchiscono la nostra toolbox. Il toolkit è disponibile, free e open source, su CodePlex.

Tra i vari controlli disponibile, quello più atteso è la DataGrid che sopperisce ad alcune mancanze di WPF. In questo post iniziamo a prendere confidenza con questo controllo, vedendo un semplicissimo esempio di utilizzo abbinato a LINQ-to-SQL.

Dopo aver scaricato e installato il toolkit, aprite Visual Studio 2008 e create un nuovo progetto WPF. Quando il designer è pronto, dalla toolbox trascinate il controllo DataGrid sulla finestra. Questa operazione fa sì che al progetto vengano aggiunti i riferimenti necessari all’assembly WPFToolkit.dll e un namespace Xml per utilizzare il controllo da XAML.

Il codice, a questo punto, è il seguente:

<Window x:Class="Window1"

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

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

    Title="Window1" Height="300" Width="300" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit">

    <Grid>

        <my:DataGrid Name="DataGrid1" />

    </Grid>

</Window>

Fatto questo, aggiungete al progetto un modello a oggetti basato su LINQ-to-SQL per accedere al database di esempio Northwind. Per semplicità, non descriverò in questa sede i passaggi necessari, ma potete trovarli in questo mio articolo su LINQ-to-SQL. Nella classe LINQ-to-SQL dovrà confluire semplicemente una tabella, per esempio la tabella Orders. Fatto questo, suddividiamo la Grid in due righe, in modo che la prima contenga la DataGrid e la seconda un pulsante che poi descriveremo meglio più avanti. Notate anche le modifiche allo XAML nella DataGrid:

    <Grid>

        <Grid.RowDefinitions>

            <RowDefinition/>

            <RowDefinition Height="30"/>

        </Grid.RowDefinitions>

 

        <my:DataGrid Grid.Row="0" Name="DataGrid1" ItemsSource="{Binding}"

                     CanUserDeleteRows="True"

                     CanUserAddRows="True"

                     CanUserReorderColumns="True"

                     CanUserSortColumns="True"

                     IsSynchronizedWithCurrentItem="True">

        </my:DataGrid>

 

        <Button Grid.Row="1" Width="100" Height="25" Content="Save" Click="Button_Click"/>

    </Grid>

La proprietà ItemsSource è in binding e verrà assegnata da codice Visual Basic. Ci sono altre proprietà, peraltro assegnabili tramite la Finestra delle Proprietà, che si spiegano da sole e permettono all’utente di agire su righe e colonne.

Passate ora all’editor di codice Visual Basic, nell’esempio Window1.xaml.vb. In primo luogo, otteniamo l’istanza del DataContext:

    Private Northwind As New NortwindDataContext

Supponiamo, ora, di voler ottenere tutti gli ordini effettuati dal cliente il cui ID sia “PICCO”. Lo facciamo attraverso una semplicissima query:

    Private Function GetOrders() As IQueryable(Of Order)

 

        Dim query = From ord In Northwind.Orders _

                  Where ord.CustomerID = "PICCO" _

                  Select ord

 

        Return query

    End Function

Ora si può modificare il costruttore, affinchè perfezioni il data-binding all’avvio dell’applicazione:

    Public Sub New()

 

        ' This call is required by the Windows Form Designer.

        InitializeComponent()

 

        ' Add any initialization after the InitializeComponent() call.

        Me.DataContext = GetOrders()

    End Sub

Assegnando la proprietà DataContext della Window, automaticamente la ItemsSource della DataGrid viene popolata e associata. Da ultimo, gestiamo l’evento Click del pulsante, che ci occorre per salvare le modifiche che faremo ai dati:

    Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)

        Northwind.SubmitChanges()

    End Sub

Ora avviate l’applicazione, potrete così osservare il risultato del nostro lavoro che si presenta come in figura:

 

Provate a modificare i dati nelle celle (selezionandole col mouse), a posizionarvi su una riga e premere Canc per rimuoverla, a riempire la riga vuota. Se poi cliccate sul pulsante Save, le modifiche verranno inviate al database.

Alcune considerazioni:

1.    è possibile modificare i valori nelle celle;

2.    è possibile rimuovere record semplicemente premendo il tasto Canc sulla riga desiderata;

3.    è possibile aggiungere nuovi record semplicemente riempiendo la riga libera a disposizione;

4.    è possibile applicare stili e template alle celle e alle colonne affinchè cambino il loro aspetto e le tipologie di contenuto;

5.    la DataGrid offre, di default, i tipi DataGridTextColumn (testo e assimilati), DataGridCheckBoxColumn (booleani), DataGridHyperLinkColumn (collegamenti ipertestuali) e DataGridComboBoxColumn. Sfruttando il DataGridTemplateColumn, è possibile creare template per le celle, di modo che contengano qualunque altro controllo supportato (es. Image).

Ciò premesso, vediamo come migliorare l’aspetto della nostra DataGrid. In primo luogo, possiamo rifare modificare l’aspetto delle celle quando sono selezionate, sfruttando stili e triggers:

            <my:DataGrid.Resources>

                <Style x:Key="CellStyle" TargetType="{x:Type my:DataGridCell}">

                    <Style.Triggers>

                        <Trigger Property="IsSelected" Value="True">

                            <Setter Property="Background">

                                <Setter.Value>

                                    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">

                                        <GradientStop Color="Black" Offset="0"/>

                                        <GradientStop Color="White" Offset="0.5"/>

                                        <GradientStop Color="Gray" Offset="1"/>

                                    </LinearGradientBrush>

                               </Setter.Value>                             

                            </Setter>

                            <Setter Property="Foreground" Value="Red"/>

                        </Trigger>

                    </Style.Triggers>

                </Style>

Se avete un po’ di dimestichezza con gli stili, il codice sopra illustrato non presenta particolari difficoltà. Il modo di utilizzo rimane lo stesso. Sempre sfruttando gli stili, possiamo rifare il look alle intestazioni di colonna, anch’esse incluse nelle risorse:

                <Style x:Key="ColumnHeaderStyle" TargetType="{x:Type my:DataGridColumnHeader}"      

                   BasedOn="{StaticResource {x:Type my:DataGridColumnHeader}}">

                    <Setter Property="Background">

                        <Setter.Value>

                            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">

                                <GradientStop Color="DarkBlue" Offset="0"/>

                                <GradientStop Color="Violet" Offset="0.5"/>

                                <GradientStop Color="Blue" Offset="1"/>

                            </LinearGradientBrush>

                       </Setter.Value>

                    </Setter>

                    <Setter Property="Foreground" Value="White" />

                    <Setter Property="BorderThickness" Value="1"/>

                    <Setter Property="BorderBrush" Value="Black"/>

                    <Setter Property="HorizontalContentAlignment" Value="Center" />

                </Style>

            </my:DataGrid.Resources>

Possiamo infine impostare un colore di sfondo per le row stabilendo un’alternanza. Lo sfondo:

            <my:DataGrid.RowBackground>

                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">

                    <GradientStop Color="Orange" Offset="0"/>

                    <GradientStop Color="Yellow" Offset="0.5"/>

                    <GradientStop Color="Red" Offset="1"/>

                </LinearGradientBrush>

            </my:DataGrid.RowBackground>

Lo sfondo per le righe alternate:

            <my:DataGrid.AlternatingRowBackground>

                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">

                    <GradientStop Color="DarkGreen" Offset="0"/>

                    <GradientStop Color="Green" Offset="0.5"/>

                    <GradientStop Color="White" Offset="1"/>

                </LinearGradientBrush>

            </my:DataGrid.AlternatingRowBackground>

Ora provate ad avviare l’applicazione e vedrete un risultato decisamente diverso, come in figura:

 

Pur con i limiti che ha un controllo di questo tipo, la DataGrid è, a mio avviso, un bel controllo. Ci sono molte altre potenzialità offerte (esempio: un DatePicker nel template delle celle) che non si esauriscono in un post introduttivo come questo, ma di cui ci interesseremo in futuro.

Il codice sorgente illustrato nel post è scaricabile dall’area download di VB T&T a questo indirizzo.

Alessandro

Print | posted on venerdì 31 ottobre 2008 01:43 | Filed Under [ Visual Basic Visual Studio 2008 Windows Presentation Foundation LINQ ]

Powered by:
Powered By Subtext Powered By ASP.NET