Newsgroup: it.comp.lang.visual-basic
Titolo: Controllare modifica dati maschere .NET

In .net devo fare diverse form che salveranno dati su alcune tabelle.
Vorrei fare in modo che se l'utente non modifica alcun dato il salvataggio
non avvenisse, per cui ho pensato vari ipotesi:
1) Disabilito il pulsante Salva, centralizzando gli eventi "Changed" dei
vari controlli che andranno a riabilitarlo.
2) Mi carico i dati in una struttura (datarow, classe o altro), e li
riconfronto al salvataggio, se sono tutti uguali
Nel caso 1) immagino dovrei fare un codice del genere:
    Private Sub InitForm()
        AddHandler txt1.TextChanged, AddressOf ChangedHandler
        AddHandler txt2.TextChanged, AddressOf ChangedHandler
        AddHandler txt3.TextChanged, AddressOf ChangedHandler
        AddHandler txt4.TextChanged, AddressOf ChangedHandler
        AddHandler txt5.TextChanged, AddressOf ChangedHandler
	... ecc
    End Sub
    Private Sub ChangedHandler(ByVal sender As Object, ByVal e As
System.EventArgs)
        btnSalva.Enabled = True
    End Sub
Nel caso due dovrei fare comunque un confronto per ogni singolo controllo,
oppure se avessi i controlli in binding, avere qualche proprietà del
binding source che mi dica se sono state fatte variazioni.
Quale strada è consigliabile? Ad occhio direi più la prima, perchè dal
punto di vista dell'utente vede che non può salvare senza modificare, se
usassi il 2) dovrei comunque dare un msgbox per dire che non è stato
modificato nulla.
PS: devo evitare che si risalvino dati semplicemente perchè la logica del
programma deve storicizzare tutte le versioni di record, e avere migliaia
di record uguali solo perchè gli utenti sono abituati a premere SALVA
invece di ANNULLA non mi piace.
XPost: it.comp.lang.visual-basic, microsoft.public.it.dotnet.vb
FwUp: it.comp.lang.visual-basic

 non avvenisse, per cui ho pensato vari ipotesi:
Il sistema 1, nella forma descritta, non va, perchè l'utente può
modificare un campo, poi cambiare idea e rimetterlo come prima, ed
ecco li che ti ha fregato.
Per stare tranquillo dovresti comunque confrontare i dati presenti
nella UI con quelli presenti in apertura.
Puoi provare a combinare le due cose centralizzando un gestore di
evento per Validating e/o Validated (più generico di Change, così va
bene anche per controlli eterogenei tipo combo, liste ecc..) nel quale
però prima di attivare il pulsante verifichi il valore di 'sender' con
il corrispondente campo dell'origine dati.

 il corrispondente campo dell'origine dati.
Mi avevano anche consigliato di estendere la textbox con una property
OriginalText che assocerei io in fase di caricamento (che a sua volta
aggiorna la propriet� Text), e poi con un metodo DataChanged che mi dice se
quella � stata aggiornata.
Il brutto di questo � che dovrei farlo per ogni controllo (datetimepicker
ecc.) che vado ad utilizzare.

 ecc.) che vado ad utilizzare.
Allora ho spippolato un po', � venuto fuori un po' di roba :)
1) Interfaccia che mi definisce un comportamento comune (property
OriginalText, Function boolean DataChanged, Method ResetChanges)
2) Estendo textbox implementando interfaccia 1
3) Classe derivata da List (Of Mia Intefaccia):
Public Class ControlList
    Inherits List(Of IDataControl)
    Public Sub ResetChanges()
        For Each cc As IDataControl In Me
            cc.ResetChanges()
        Next
    End Sub
    Public Function DataChanged() As Boolean
        For Each cc As IDataControl In Me
            If cc.DataChanged Then Return True
        Next
        Return False
    End Function
End Class
4) Nella form di utilizzo:
Private InputControls As New ControlList
' nel codice (oltre ad assegnazione di OriginalText)
        InputControls.Add(txtNome)
        InputControls.Add(txtCognome)
ecc.
' Al salvataggio
If InputControls.DataChanged Then
	' salva
End If
Cos� potr� mettere in futuro altri controlli di tipo omogeneo, derivandoli
dal controllo base e implementando l'interfaccia.