Question

J'ai créé ce vide de la propriété:

enter image description here

Mais après l'attribution d'un nouveau ArrayList objet de la propriété, la propriété reste toujours vide à chaque exécution de l'application.

Dans un gestionnaire de MyBase.Charge cas je fais un appel à cette méthode, juste pour le test de ce problème:

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

Comme vous pouvez le voir dans le code ci-dessus, je suis l'attribution d'une nouvelle liste de tableaux avec une entrée, mais que les changements prennent effet pendant que le montage de dossier d'exécution, si je l'ai sortie de l'application alors que la propriété va de nouveau vide.

Et aussi, bien sûr, j'ai coché cette option:

enter image description here

Mais de toute façon c'est inutile puisque je suis enregistrer la configuration à la main dans le code, donc...

Pourquoi ce qui se passe?.

Comment je peux résoudre ce problème?.

Mise à JOUR:

Je l'ai étudié et il semble que c'est un problème connu que les Tableaux, ArrayLists et un médicament Générique collections(De Type) ne peut pas être enregistré par le mes.les paramètres (mais d'un autre côté un StringCollection peut)

Mais dans la dernière réponse de ce post (MemoryStream réponse) explique un moyen facile d'enregistrer de façon permanente les modifications d'une liste de tableaux de mon.paramètres, puis lire dans la prochaine exécution de l'application.

La réponse semble très bon, mais je suis un peu perdu avec le code et les étapes pour continuez, si quelqu'un pouvait expliquer les étapes expliquées là, mais dans un langage lisible par la pour moi s'il vous plaît?

J'ai vérifié que la liste de tableaux reste dans la prochaine exécution de l'application, oui, mais je ne suis pas sûr de ce que je fais parce que si MemoryStream contient l'ancien ArrayList alors ce que je fais maintenant Est de l'affectation de la de Mes.Les paramètres.MRU comme Arraylist qui contient plus d' Arraylists au lieu de l'origine ArrayList qui contient une String() ?, et de toute façon comment charger le tableau des entrées après l'enregistrement de la définition de cette façon?.

C'est ce que j'ai essayé de cette réponse:

' 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)
Était-ce utile?

La solution

Si vous avez les données dans une liste de tableaux (ou de la Liste ou de la Collection), et vous êtes à la recherche à la BinaryFormatter pour la solution de contournement, il n'y a pas de bonne raison de également de également utiliser Mon.Les paramètres.Vous pouvez faire ce qu'il fait à travers le BinaryFormatter, qui est juste de l'enregistrement du fichier et de choisir un nom.

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)

Enregistrer Les Paramètres:

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

Charger Les Paramètres:

' 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

Une fois que vous avez recours à BF pour la solution de contournement, en remplacement de la Mémoire de Flux, un Flux de Fichier se débarrasse de la nécessité pour moi.Entièrement la configuration, vous permet de stocker le fichier où vous le souhaitez et il l'habitude de changer de version, l'utilisateur de changer le nom de l'exécutable ou quoi que ce soit d'autre, sauf si vous modifiez le nom de fichier de la formule ci-dessus.

Pour une Application avec plus que juste le MRU liste de tableaux, vous pouvez utiliser une Classe à sa place pour stocker tous les paramètres de l'emplacement que vous souhaitez aime beaucoup les Paramètres.Vous avez juste besoin de balise de la Classe <Serializable>.Il reste une seule ligne de code pour enregistrer l'ensemble de la classe, une ligne à le reconstituer.Il y a quelques limitations, mais ils ne sont pas difficiles à surmonter.

Private myNewSettings As New myNewSettingsClass
...

bf.Serialize(fs, myNewSettings)

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

Dans d'autres situations, vous pouvez utiliser le sérialiseur XML ou ProtoBuf-NET au besoin de la situation.

Vous pouvez également avoir vos nouveaux paramètres enregistrés automatiquement lorsque le programme se termine:Aller à Propriétés Du Projet --> Applications --> Cliquez Sur Afficher Les Événements D'Application.Sélectionnez l'Application "Événements" dans le menu de gauche, et Arrêt à partir de la droite de l'événement menu.

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

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

De même, vous pouvez avoir automatiquement les charger dans la Startup de l'événement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top