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.