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

LINQ-to-SQL: esempio di validazione personalizzata con VB 2008

Una delle caratteristiche più interessanti di LINQ-to-SQL è quella che permette di aggiungere al codice delle regole di validazione custom per i dati inseriti dall’utente, sfruttando una delle nuove caratteristiche del linguaggio Visual Basic 2008: i metodi parziali.

 

Supponiamo di avere un’applicazione Windows Forms che mostri l’elenco dei clienti contenuti nella tabella Customers del nostro caro database Northwind. Se non avete confidenza con le procedure da seguire per creare un’applicazione di base che sfrutti LINQ-to-SQL, vi consiglio di leggere questo mio articolo su VB T&T, ad ogni buon conto riassumo i passaggi in maniera schematica:

 

1.    creazione del progetto Windows Forms;

2.    connessione al database Northwind tramite la finestra Esplora Server (o Esplora Database in VB Express);

3.    aggiunta al progetto di una classe LINQ-to-SQL, chiamata Northwind.dbml;

4.    drag’n’drop dalla finestra Esplora Server della tabella Customers sulla superficie del designer OR/M di Visual Studio 2008;

5.    compilazione della soluzione e aggiunta di una nuova origine dati che punta alla classe Customers, generata dall’IDE;

6.    trascinamento dell’oggetto Customers, dalla finestra Origini Dati sulla superficie del form dell’applicazione, con aggiunta automatica, da parte dell’IDE, di controlli e data-binding.

 

Una volta che il controllo BindingNavigator è stato aggiunto, facciamo clic destro sul pulsante di salvataggio e selezioniamo il comando Enabled, al fine di abilitare il pulsante stesso. Ipotizziamo, poi, di voler validare in modo personalizzato l’inserimento del codice postale.  

 

Dopo aver attivato l’editor di codice, otteniamo l’istanza del DataContext:

 

Private dc As New NorthwindDataContext

 

Quindi scriviamo una riga di codice che popoli la griglia con i clienti contenuti nella classe Customers:

 

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

     'popola la griglia

     CustomersBindingSource.DataSource = dc.Customers

End Sub

 

Il seguente codice, invece, gestisce l’evento Click del pulsante di salvataggio e tenta di inviare le modifiche al database sottostante:

 

Private Sub CustomersBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CustomersBindingNavigatorSaveItem.Click

    Try

       Me.Validate()       'valida i dati

       CustomersBindingSource.EndEdit()    'termina la fase di editing

       dc.SubmitChanges()  'invia i cambiamenti al database

 

       'in caso di errori annulla le modifiche

    Catch ex As Exception

       CustomersBindingSource.CancelEdit()

    End Try

End Sub

 

Tutte le tecniche appena illustrate sono comunque descritte nell’articolo su LINQ-to-SQL sopra citato. E ora viene il bello. La classe Customers generata dall’IDE in fase di mapping (o meglio, dall’IDE tramite SqlMetal.exe), espone un metodo chiamato OnPostalCodeChanging, che noi possiamo sfruttare per validare il contenuto della cella in cui l’utente digita il codice postale del cliente. Per farlo, però, ci avvaliamo di un metodo parziale, implementato all’interno di una classe parziale. Poiché è più semplice a farlo che a dirlo, create una nuova classe parziale Customers in questo modo (nel codice allegato io l’ho fatto nel file di codice Form1.vb, ma potete creare un file di codice apposito):

 

Partial Public Class Customers

 

 

End Class

 

Per validare un codice postale la soluzione migliore è ricorrere a una regular expression. Lo facciamo implementando, all’interno della classe parziale, un metodo parziale che completi la firma definita nella classe Customers auto-generata. Tra l’altro, questo metodo offre due overload, uno dei quali riceve un argomento String:

 

'Richiede una direttiva Imports System.Text.RegularExpressions

Private Sub OnPostalCodeChanging(ByVal value As String)

 

    'Il pattern dell'espressione regolare richiede che il codice

    'postale sia di 5 cifre

    Dim confronto As New Regex("(^\d{5}$)")

 

    If confronto.IsMatch(value) = False Then

       'tecnica del re-throw

       Throw New ArgumentException("Il codice postale inserito non è valido")

    End If

 

End Sub

 

In questo modo non abbiamo intaccato il file generato dal designer, cosa che potrebbe compromettere il buon funzionamento dell’applicazione. Classi e metodi parziali hanno fondamentalmente questo scopo.

 

Tramite il metodo IsMatch della classe RegEx abbiamo verificato che il codice postale ricevuto come argomento del metodo sia conforme al pattern dell’espressione regolare. Qualora non lo fosse, abbiamo specificato al compilatore di sollevare una ArgumentException tramite la tecnica del re-throw, di modo che l’eccezione stessa venga gestita altrove. 

 

Ma dove, dal momento che non abbiamo previsto l’intercettazione della ArgumentException nel gestore dell’evento Click del pulsante di salvataggio? Beh, c’è un’alternativa. Possiamo gestire l’evento DataError del controllo DataGridView. Facendo questo, infatti, possiamo visualizzare un messaggio di errore personalizzato. Se lasciassimo l’intercettazione di eccezioni classica, al contrario, il CLR mostrerebbe un messaggio di errore molto lungo, sicuramente comprendente quello da noi specificato, ma decisamente fuori luogo.

 

Ciò posto, scriviamo quanto segue:

 

Private Sub CustomersDataGridView_DataError(ByVal sender As Object, _

            ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) _

            Handles CustomersDataGridView.DataError

 

    MessageBox.Show(e.Exception.Message, "", MessageBoxButtons.OK, _

                    MessageBoxIcon.Error)

 

End Sub

 

Se ora provate ad avviare l’applicazione, tentando di inserire un nuovo cliente il cui codice postale sia di sole tre cifre (ad esempio), otterrete un risultato simile a quello mostrato in figura:

 

 

In conclusione abbiamo visto all’opera un’altra novità sintattica di Visual Basic 2008, la cui utilità in LINQ-to-SQL trova la sua massima espressione.

 

Qui potete scaricare il codice sorgente (nel quale, come sempre, non ho incluso Northwind):

 

 

Alessandro

Print | posted on martedì 27 maggio 2008 21:29 | Filed Under [ Visual Basic LINQ ]

Powered by:
Powered By Subtext Powered By ASP.NET