Domanda

Ho impostato questa proprietà di vuoto:

Inserisci Descrizione dell'immagine qui

Ma dopo aver assegnato un nuovo oggetto ArrayList alla proprietà, la proprietà è sempre vuota ancora in ogni esecuzione dell'applicazione.

In un gestore di MyBase.load evento Io faccio una chiamata a questo metodo, solo per testare questo problema:

sub blahblah handles mybase.load
    me.CheckRecentFiles
end sub

Private Sub CheckRecentFiles()

    Try
        ' This throws an object not referenced exception 'cause always is empty.
        MsgBox(My.Settings.RecentFiles.Count)
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try

    ' Just for testing, if the collection is empty then I instance a new ArrayList
    ' and I assign it to the property and I save it and exit from the application.
    ' But even doing this the property is always empty in the next execution.
    If My.Settings.RecentFiles Is Nothing Then

        My.Settings.RecentFiles = New ArrayList
        My.Settings.RecentFiles.Add({"test-Item1", "test-Item2", "Test-Item3"})
        My.Settings.Save()
        Application.Exit()

    End If

End Sub
.

Come puoi vedere nel codice sopra sto assegnando un nuovo arrayList con una voce, ma le modifiche hanno solo effettive durante quell'esecuzione dell'Applicazione, se esco dall'app, la proprietà viene nuovamente vuota.

E anche incollo che ho controllato questa opzione:

Inserisci Descrizione dell'immagine qui

Ma comunque non è necessario poiché sto salvando l'impostazione manuale nel codice, quindi ...

Perché succede questo?.

Come posso risolvere questo problema?.

.

Aggiornamento:

Ho indagato e sembra che questo sia un problema noto che gli array, gli array, gli schedi e le collezioni generiche (di tipo) non possano essere salvate dai miei .settings (ma dall'altra mano una cordoncellezione può) Ma nell'ultima risposta di Questo post (The MemoryStream Risposta) Spiega un modo semplice per salvare in modo permanente le modifiche di un arrayList a My.settings e quindi leggerlo nella prossima esecuzione dell'applicazione.

La risposta sembra molto buona, ma sono un po 'perso con il codice e i passi per procurarsi, quindi qualcuno potrebbe spiegare i passaggi spiegati lì ma in un linguaggio leggibile da uomo per me per favore?

Ho verificato che l'arraylist rimane nella prossima esecuzione dell'applicazione, sì, ma non sono sicuro di quello che sto facendo 'Causa se il MemoryStream contiene il vecchio arrayList allora quello che sto facendo ora sta assegnando il mio .Settings.mru Impostazione come arrayList array che contiene più Arraylists invece l'arrayList originale che conteneva un String()?, E comunque come caricare le voci dell'array dopo aver salvato l'impostazione in questo modo?.

Questo è quello che ho provato da quella risposta:

' Create the ArrayList
Dim tmpArrayList = New System.Collections.ArrayList
tmpArrayList.Add({"test-Item1-1", "test-Item1-2", "Test-Item1-3"})
tmpArrayList.Add({"test-Item2-1", "test-Item2-2", "Test-Item2-3"})

' Serialize the arraylist entries:
Dim formatter As Runtime.Serialization.IFormatter =
    New Runtime.Serialization.Formatters.Binary.BinaryFormatter
Dim ms1 As New IO.MemoryStream
formatter.Serialize(ms1, tmpArrayList)

' Save the ArrayList
My.Settings.MRU = New ArrayList(ms1.ToArray) ' I think it hould be like that?

' Load the ArrayList contained in My.Settings.MRU (no idea)
.

È stato utile?

Soluzione

Se si dispone dei dati in un arrayList (o elenco o raccolta), e stai guardando il BinaryFormatter per la soluzione alternativa, non c'è una buona ragione per utilizzare anche i miei prodotti. Puoi fare ciò che fa attraverso il binaryformatter, che sta solo salvando il file e selezionando un nome.

Imports System.Runtime.Serialization.Formatters.Binary

Private MRUArrayList = New ArrayList
' file location
 myFile = System.IO.Path.Combine(Environment.GetFolderPath(Environment. _
                    SpecialFolder.ApplicationData),
                                    CompName,
                                    ProgramName,
                                    File)
.

Salva impostazioni:

Dim bf As New BinaryFormatter
Using fs As New FileStream(myFile, FileMode.OpenOrCreate)
    bf.Serialize(fs, MRUArrayList )
End Using
.

Impostazioni di caricamento:

' dont attempt for the first time run
If File.Exists(myFile) = False Then Return False

Dim bf As New BinaryFormatter
Using fs As New FileStream(myFile, FileMode.Open)
    MRUArrayList = CType(bf.Deserialize(fs), ArrayList)
End Using
.

Una volta necessario ricorrere a BF per la soluzione alternativa, la sostituzione del flusso di memoria con un flusso di file si libera della necessità di my.settings interamente, consente di archiviare il file ovunque tu voglia e non cambierà per la versione, cambiando l'utente Il nome EXE o qualsiasi altra cosa a meno che non modifichi la formula del nome del file sopra.

Per un'app con più del semplice arrayList MRU, è possibile utilizzare una classe al suo posto per memorizzare tutte le impostazioni nella posizione che si desidera che le impostazioni molto simili. Hai solo bisogno di taggare la classe come <Serializable>. Rimane una riga di codice per salvare l'intera classe, una linea per ricostituirla. Ci sono alcune limitazioni, ma non sono difficili da superare.

Private myNewSettings As New myNewSettingsClass
...

bf.Serialize(fs, myNewSettings)

myNewSettings = CType(bf.Deserialize(fs), myNewSettingsClass )
.

In altre situazioni, è possibile utilizzare il serializzatore XML o PROTOBUF-NET secondo necessità per la situazione.

È inoltre possibile salvare automaticamente le tue nuove impostazioni quando il programma esce: Vai a Proprietà del progetto -> Applicazione -> Fare clic su Visualizza eventi di applicazione . Selezionare "Eventi dell'applicazione" dal menu a sinistra e Shutdown dal menu Evento destro.

Private Sub MyApplication_Shutdown(sender As Object, 
          e As EventArgs) Handles Me.Shutdown

   ' add your code to Save (above) here
End Sub
.

Allo stesso modo puoi farli caricare automaticamente nell'evento Startup.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top