sabato 16 febbraio 2008

vb.net IChangeTracking - ho salvato i miei dati?

Una cosa che ogni applicazione dovrebbe fare è sicuramente quella di avvisare l'utente nel caso in cui i dati sui quali sta lavorando siano stati modificati ma non ancora salvati. Implementare una proprietà del genere non è complicato ed evita all'utente di dover scomodare tutti i santi del calendario quando, colto da improvviso raptus, decide di chiudere il form sul quale stava
faticosamente lavorando senza aver prima salvato il lavoro svolto. A grandi linee, ci sono due approcci per poter dotare la nostra applicazione di questa caratteristica: o decidiamo di creare una infrastruttura che controlli le operazioni che compiamo sui dati o deleghiamo ai dati stessi la responsabilità di tenere traccia del loro stato. Il secondo approccio è, a mio parere, quello più
elegante ma anche quello più semplice da realizzare, vediamo come. Per raggiungere il nostro scopo ci basterà implementare l'interfaccia IChangeTracking definita qui di seguito



Public Interface IChangeTracking
ReadOnly Property IsChanged()As Boolean
Sub
AcceptChanges()
End Interface


La proprietà in sola lettura IsChanged restituisce True se l'oggetto ha subito delle modifiche mentre il metodo AcceptChanges serve per confermare le modifiche apportate. Vediamo qualcosa di più concreto realizzando, a scopo dimostrativo, una classe Persona che implementa IChangeTracking.




Public Class Persona
Implements IChangeTracking

Private mIsChanged As Boolean
Private mNome as String
Private mCognome as String

Public Sub New()

mIsChanged = False
mNome = ""
mCognome = ""

End Sub

Public Sub AcceptChanges() Implements IChangeTracking.AcceptChanges

mIsChanged = False

End Sub

Public ReadOnly Property IsChanged() As Boolean Implements IChangeTracking.IsChanged
Get
Return
mIsChanged
End Get
End Property

Public Property
Nome() As String
Get
Return
mNome
End Get
Set
(ByVal value As String)
If mNome <> value Then
mIsChanged = True
mNome = value
End If
End Set
End Property

Public Property
Cognome() As String
Get
Return
mCognome
End Get
Set
(ByVal value As String)
If mCognome <> value Then
mIsChanged = True
mCognome = value
End If
End Set
End Property

End Class



Ogni volta che cambiamo il valore di una proprietà settiamo la variabile privata mIsChanged a True che verrà rimessa a False quando richiameremo il metodo AcceptChanges(). Tornando all'esempio fatto all'inizio del post, quando l'utente prova a chiudere il form, basterà controllare il valore della proprietà IsChanged per sapere se ci sono dati non ancora salvati. Ovviamente dovremo anche avere cura di richiamare il metodo AcceptChanges ogni volta che l'utente esegue il salvataggio dei dati.