Pregunta

Me he fijado este vacío propiedad de:

enter image description here

Pero después de la asignación de un nuevo ArrayList objeto de la propiedad, la propiedad siempre vacía en cada ejecución de la aplicación.

En un controlador de MyBase.Carga caso tengo que hacer una llamada a este método, sólo para probar este 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

Como se puede ver en el código anterior estoy asignación de un nuevo ArrayList con una entrada, pero los cambios sólo se aplicarán durante la ejecución de la aplicación, si salgo de la aplicación, a continuación, la propiedad pasa de nuevo vacía.

Y también, por supuesto he comprobado esta opción:

enter image description here

Pero de todos modos que es innecesario ya que estoy guardar la configuración manualmente en el código, así que...

¿Por qué sucede esto?.

Cómo puedo resolver este problema?.

ACTUALIZACIÓN:

He investigado y parece que este es un problema conocido de que las Matrices, ArrayLists y cualquier colecciones Genéricas(De Tipo) no puede ser salvado por el mi.configuración (pero en el otro lado un StringCollection puede)

Pero en la última respuesta de este post (MemoryStream respuesta) explica de una manera fácil de guardar permanentemente los cambios de un ArrayList para mi.configuración y, a continuación, leer en la siguiente ejecución de la aplicación.

La respuesta parece muy buena, pero estoy un poco perdido con el código y las medidas que proceda, por lo que alguien podría explicar los pasos que se explican ahí, pero en un formato legible idioma para mí por favor?

He comprobado que el ArrayList permanece en la siguiente ejecución de la aplicación, sí, pero no estoy seguro de lo que estoy haciendo porque si MemoryStream contiene el antiguo ArrayList entonces lo que estoy haciendo ahora Es la asignación de la Mi.Los ajustes.MRU como un Arraylist que contiene más Arraylists en lugar de la original ArrayList que contiene un String() ?, y de todos modos cómo cargar la matriz de entradas después de guardar la configuración de esta manera?.

Esto es lo que he tratado de esa respuesta:

' 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)
¿Fue útil?

Solución

Si tenemos los datos en una arrayList (o la Lista o Colección), y que busca en la BinaryFormatter para la solución, no hay ninguna buena razón para también usar Mi.Los ajustes.Usted puede hacer lo que se hace a través de la BinaryFormatter, que se acaba de guardar el archivo y elegir un nombre.

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)

Guardar Configuración:

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

La Configuración De Carga:

' 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 vez que usted tiene que recurrir a BF para la solución, en sustitución de la Secuencia de Memoria con una Secuencia de Archivos elimina la necesidad para Mi.Configuración totalmente, permite almacenar el archivo donde quieras y no lo puedo cambiar por la versión, el usuario cambiar el nombre del EXE o cualquier otra cosa a menos que cambie el nombre de archivo de la fórmula anterior.

Para una Aplicación mucho más que el MRU ArrayList, puede utilizar una Clase en su lugar para almacenar todos los ajustes a la ubicación en la que desea muy parecida a la de Configuración no hace.Usted necesidad justa de la etiqueta de la Clase como <Serializable>.Se mantiene una línea de código para guardar toda la clase, una línea para la reconstitución de la misma.Hay algunas limitaciones, pero que no son difíciles de superar.

Private myNewSettings As New myNewSettingsClass
...

bf.Serialize(fs, myNewSettings)

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

En otras situaciones, puede utilizar el serializador de XML o ProtoBuf-NET como necesario para la situación.

Usted también puede tener su nueva configuración guarda automáticamente cuando se sale del programa:Ir a Propiedades Del Proyecto --> Aplicaciones --> Haga Clic En La Vista De Eventos De Aplicación.Seleccione la Aplicación "Eventos" en el menú de la izquierda, y Apagado desde la derecha del menú evento.

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

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

Asimismo puede cargar automáticamente en el Startup evento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top