Avviso di cambiamento dati nei controlli

venerdì 27 luglio 2012 - 15.55

Mau67 Profilo | Expert

Ciao al forum,
nella mia applicazione ho un form con 70 textbox, 22 MaskedTextBox e 66 CheckBox, ho la necessità di avere un messaggio in fase di chiusura del form o quando schiaccio un determinato button di avvisarmi che se uno di questi controlli ha subito un cambiamento deve comparirmi un msgbox che mi avvisa di salvare prima di chiudere se non c'è stato cambiamento posso passare alla chiusura del form e altra operazione senza che il msgbox si attivi.

Come posso fare ?

grazie in anticipo
Mau67

AntCiar Profilo | Expert

Ciao
in fase di caricamento dati associ al Tag dell'oggetto (se non già utilizzato per altre cose), il valore che vai a visualizzare.

Poi il controllo lo fai in questo modo:

ti scorri tutti gli oggetti presenti sulla form e a seconda del tipo (TextBox, Checkbox, etc) controlli se il valore corrente è diverso da quello memorizzato nel tag.
Cristian Barca

Mau67 Profilo | Expert

Ciao Cristian,
io ho fatto cosi però non so come associare ad un tasto di chiusura del form.
Pensi sia corretto quello che ho fatto? e come lo associo al butto di chiusura del form?

'Controlla se ci sono cambiamenti nei controlli
Dim cambiato As Boolean
Private Sub Controlla(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.ControlAdded
cambiato = True
End Sub

'contralla i cambiamenti nei controlli
For Each C As Control In Me.Controls
AddHandler C.TextChanged, AddressOf Controlla
Next
Mau67

AntCiar Profilo | Expert

come hai fatto tu ti valorizza la variabile booleana solo all'effettivo cambiamento del valore (almeno per le textbox). Questo fa si che se per esempio nella textbox1 hai in partenza il valore "ciao" e ci vai dentro cancellando e riscrivendo "ciao" la variabile viene lo stesso valorizzata e non so se per te vale lo stesso come un cambiamento.

Se vuoi lasciare le cose come stanno basta che ti metti in ascolto dell'evento FormClosing della Form. In questo evento controlli lo stato della variabile booleana e rchiedi eventualmente il salvataggio. Questo tipo di evento si scatena sia quando invochi il metodo .Close() della form sia quando clicchi sulla X rossa in alto a desta. Questo evento tramite e.Handled = true ti permette anche di annullare la chiusura della form.


Cristian Barca

Mau67 Profilo | Expert

no infatti non va bene il cambiamento deve essere significativo, e poi il codice devo gestirlo oltre che dalla chiusura del form anche da alcuni button che mi aprono altri form quindi prima di aprire altri form deve avvisarmi di salvare.

Non avresi del codice pronto per rendermi conto di come fare anche perchè i controlli sono tanti?

Grazie
Mau67

AntCiar Profilo | Expert

Questo è il codice per controllare se i valori sono cambiati

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


ovviamente dovrai valorizzare il tag di singoli controlli in fase di caricamento dati altrimenti non funziona.
Cristian Barca

Mau67 Profilo | Expert

Ho messo questo in una Classe

Public Sub Controlli_FrmAziende(ByVal ctl As Control)
Dim changed As Boolean = False
Dim ctrl As Control
For Each ctrl In Aziende.Controls
If TypeOf ctrl Is TextBox Then
If Not CType(ctrl, TextBox).Text.Equals(CStr("" & ctrl.Tag), StringComparison.InvariantCultureIgnoreCase) Then
changed = True
Exit For
End If
ElseIf TypeOf ctrl Is TextBox Then
If Not CType(ctrl, CheckBox).Checked.Equals(CBool(ctrl.Tag)) Then
changed = True
Exit For
End If
End If
Next

e la richiamo da un button cosi:
controlli.Controlli_FrmAziende(Me)

non funziona: come associo il tag?
grazie
Mau67

AntCiar Profilo | Expert

Il tag lo devi associare in fase di caricamento dei dati.

Subito dopo aver fatto textBoxN.Text = Valore fai anche textBoxN.Tag = Valore
Cristian Barca

Mau67 Profilo | Expert

metto questo nel LOAD del form
TextBox2.Text =""
TextBox2.Tag = 0

poi per mandare in esecuzione il controllo?

Mau67

AntCiar Profilo | Expert

>TextBox2.Text =""
>TextBox2.Tag = 0

Dovresti mettere lo stesso valore sia in Text sia in Tag altrimenti come hai fatto tu ti dirà che sono tutte cambiate.
Cristian Barca

Mau67 Profilo | Expert

non funziona allora ricapitolo

Questo lo messo nel load del form
TextBox2.Text = ""
TextBox2.Tag = ""


Questo nella classe

Public Sub Controlli_FrmAziende(ByVal ctl As Control)
Dim changed As Boolean = False
Dim ctrl As Control
For Each ctrl In Aziende.Controls
If TypeOf ctrl Is TextBox Then
If Not CType(ctrl, TextBox).Text.Equals(CStr("" & ctrl.Tag), StringComparison.InvariantCultureIgnoreCase) Then
changed = True
Exit For
End If
ElseIf TypeOf ctrl Is TextBox Then
If Not CType(ctrl, CheckBox).Checked.Equals(CBool(ctrl.Tag)) Then
changed = True
Exit For
End If
End If
Next

e questo nell button

controlli.Controlli_FrmAziende(Me)
Me.Close()


è corretto ?
Mau67

AntCiar Profilo | Expert

no.

per prima cosa cambia la SUb in Function.
come l'hai fatta tu la chiami e poi non controlli il risultato. E' inutile.

> Public Function Controlli_FrmAziende(ByVal ctl As Control) as boolean
> Dim changed As Boolean = False
> Dim ctrl As Control
> For Each ctrl In Aziende.Controls
> If TypeOf ctrl Is TextBox Then
>If Not CType(ctrl, TextBox).Text.Equals(CStr("" & ctrl.Tag),
>StringComparison.InvariantCultureIgnoreCase) Then
> changed = True
> Exit For
> End If
> ElseIf TypeOf ctrl Is TextBox Then
>If Not CType(ctrl, CheckBox).Checked.Equals(CBool(ctrl.Tag))
>Then
> changed = True
> Exit For
> End If
> End If
> Next
> return changed

Poi controlla il risultato della Function

>e questo nell button
>
> if controlli.Controlli_FrmAziende(Me) = false then
>Me.Close()
>else
>msgbox ("Qualcosa è cambiato")
>end if
>

Cristian Barca

Mau67 Profilo | Expert

non funziona mi fà fare le operazioni senza controllare
ho provato con il button che chiude il form e lo chiude sia che non scrivo niente, che scrivendo all'interno della textbox
Mau67

AntCiar Profilo | Expert

ma le textbox stanno nella form o in un altro controllo (panel, groupbox....)

il "non funziona" è troppo generico. Fai un po di debug e dai informazioni più dettagliate altrimenti non ne usciamo vivi.
Cristian Barca

Mau67 Profilo | Expert

stanno dentro un SplitContainer1.Panel2 altri dentro panel, groupbox
Mau67

AntCiar Profilo | Expert

ecco perche non funziona. Tu gli passi la form e la funzione controlla solo i "controlli" a livello 0 del controllo che passi. Non va all'interno dei sottocontrolli.

modifica la function richiamandola in modo ricorsivo.
Metti la variabile booleana all'esterno e nella fuction dopo tutti gli Else If metti un

else

e dentro ci metti il richiamo alla function passandoci come valore ctrl
Cristian Barca

Vinsent Profilo | Senior Member

>il "non funziona" è troppo generico. Fai un po di debug e dai
>informazioni più dettagliate altrimenti non ne usciamo vivi.


Io ho avuto un problema simile con la classica form "Impostazioni" e ho risolto con degli usercontrol e una variabile Boolean nella form.
Esempio di una textbox:
Public Class miaTbox Inherits TextBox Dim testo As String 'la proprietà DEVE essere impostata in fase di carimento della form Public Property imposta_testo As String Get Return testo End Get Set(value As String) Me.Text = value testo = value End Set End Property 'imposta la variabile boolean(modifica) della form1 'verificando se il testo digitato è uguale alla 'proprietà 'imposta_testo' Private Sub controla_testo() Handles Me.TextChanged If Me.Text = testo Then Form1.modifica = False Else Form1.modifica = True End If End Sub End Class

Nella Form1:
Public Class Form1 Friend modifica As Boolean Private Sub Form1_Load() Handles MyBase.Load '******************************** 'caricamento dati nei controlli MiaTbox1.imposta_testo = "ciao" '******************************** End Sub Private Sub Form1_FormClosing(sender As System.Object, _ e As System.Windows.Forms.FormClosingEventArgs) _ Handles MyBase.FormClosing If modifica = True Then If MessageBox.Show("Chiudere senza salvare?", _ "", MessageBoxButtons.OKCancel, _ MessageBoxIcon.Question) = DialogResult.Cancel Then e.Cancel = True End If End If End Sub End Class

..."ciao"...
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5