PDA

View Full Version : [VB.NET08EE]Scrittura file serializzato


Nottambulo75
04-04-2009, 10:14
Ciao, ho creato una piccola applicazione che carica i dati da un file serializzato su un datagridview. Il problema nasce quando, dopo aver modificato i dati nel datagridview, all'uscita non mi salva i cambiamenti.

Il codice è il seguente:
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Dim i
For i = 1 To DataGridView1.RowCount - 1

Dati.Descrizione(i) = CType(DataGridView1.Rows(i).Cells("Column1").Value, String)
Dati.NomeUtente(i) = CType(DataGridView1.Rows(i).Cells("Column2").Value, String)
Dati.Password(i) = CType(DataGridView1.Rows(i).Cells("Column3").Value, String)
Dati.Indirizzo(i) = CType(DataGridView1.Rows(i).Cells("Column4").Value, String)

Next

Dim FileStream As Stream = File.Create(FileName)
Dim serializer As New BinaryFormatter
serializer.Serialize(FileStream, Dati)
FileStream.Close()
End Sub

Facendo diverse prove ho riscontrato che impostando una fonte diversa da
(DataGridView1.Rows(i).Cells("Column1").Value, String)
il programma salva nel file le modifiche. Qualcuno sa aiutarmi a capire perchè non funziona da datagridview?
Grazie, ciao

MarcoGG
04-04-2009, 18:52
E hai provato a spostare quel codice dall'evento FormClosing e invece farlo partire ad esempio da un pulsante sulla Form ? Funziona oppure no ?

Nottambulo75
05-04-2009, 10:50
:D si funziona. Ma come mai da formclosing no e da un bottone si? Grazie dell'aiuto

Kralizek
05-04-2009, 10:58
Probabilmente quando Form.Closing viene invocato i controlli figli sono già stati distrutti.

Ma potrei dire una caxxata, è un sacco che non tocco WinForms ;)

MarcoGG
05-04-2009, 15:32
Probabilmente quando Form.Closing viene invocato i controlli figli sono già stati distrutti.


Sì, penso anch'io. ;)
In ogni caso, quale che sia la ragione, non è mai una buona idea eseguire codice che faccia esplicite richieste ai componenti grafici, negli eventi di chiusura Form.
Se quel codice va eseguito alla chiusura del Form puoi inibire anzitutto la chiusura accidentale dalla ControlBox ( X ) e fare in modo che si possa chiudere solo da un pulsante "Chiudi". Ad esempio in questo modo :

1. Creo una var boolean di controllo nella Classe Form :
Public Class Form1

Private chiudiFormOk As Boolean = False
...
...

2. Intercetto la chiusura su ControlBox "X" :

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If chiudiFormOk = False Then e.Cancel = True
End Sub

3. Solo il Click su "Chiudi" adesso può, prima eseguire il codice desiderato e poi chiudere il Form :
'...
'esegui codice...
'...
chiudiFormOk = True
Me.Close()

;)

Nottambulo75
06-04-2009, 20:31
grazie del suggerimento e della spiegazione