studio read programacion net móviles leer example desarrollo curso create archivo aplicaciones .net vb.net winforms visual-studio-2013 my.settings

.net - read - My.Settings no guarda una ArrayList



manual de programacion android pdf (1)

Si tiene los datos en un arrayList (o List o Collection), y está buscando en el BinaryFormatter la solución alternativa, no hay una buena razón para usar también My.Settings. Puede hacer lo que hace a través de BinaryFormatter, que es solo 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 ajustes:

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

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 tiene que recurrir a BF para solucionar el problema, reemplazar Memory Stream con File Stream elimina la necesidad de My.Settings por completo, le permite almacenar el archivo donde lo desee y no cambiará por versión, el usuario cambiará el nombre de EXE. o cualquier otra cosa, a menos que cambie la fórmula del nombre de archivo anterior.

Para una aplicación con más que solo la lista de matrices de MRU, puede usar una clase en su lugar para almacenar todas las configuraciones en la ubicación que desea de forma muy parecida a la configuración. Solo necesita etiquetar la Clase como <Serializable> . Sigue siendo una línea de código para guardar toda la clase, una línea para reconstituirla. Hay algunas limitaciones, pero 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 usar el serializador XML o ProtoBuf-NET según sea necesario para la situación.

También puede hacer que su nueva configuración se guarde automáticamente cuando el programa sale: Vaya a Propiedades del proyecto -> Aplicación -> Haga clic en Ver eventos de la aplicación . Seleccione "Eventos de la aplicación" en el menú de la izquierda, y Apagar en el menú derecho del evento.

Private Sub MyApplication_Shutdown(sender As Object, e As EventArgs) Handles Me.Shutdown '' add your code to Save (above) here End Sub

Del mismo modo, puede hacer que los cargue automáticamente en el evento de Startup .

Establecí esta propiedad de vacío:

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

En un controlador del evento MyBase.Load hago una llamada a este método, solo 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 puede ver en el código anterior, estoy asignando una nueva ArrayList con una entrada, pero los cambios solo tienen efecto durante la ejecución de la aplicación. Si salgo de la aplicación, la propiedad se vuelve a vació.

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

Pero de todos modos eso es innecesario ya que estoy guardando la configuración a mano en el código, entonces ...

¿Por qué sucede esto?

¿Cómo puedo resolver este problema?

ACTUALIZAR:

Investigué y parece que este es un problema conocido que Array, ArrayLists y cualquier colección genérica (de tipo) no pueden ser guardadas por my.settings (pero, por otro lado, una colección StringCollection)

Pero en la última respuesta de esta publicación (la respuesta de MemoryStream) explica una forma fácil de guardar permanentemente los cambios de una ArrayList en my.settings y luego leerla en la siguiente ejecución de la aplicación.

La respuesta parece muy buena, pero estoy un poco perdido con el código y los pasos a seguir, para que alguien pueda explicar los pasos explicados allí, pero en un lenguaje legible para mí, por favor.

He verificado que 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 la lista de arreglos anterior, entonces lo que estoy haciendo ahora es asignar las Mis configuraciones. Configuración de MRU como un Arraylist que contiene más Arraylists lugar de ArrayList original que contenía un String() ?, Y de todos modos cómo cargar las entradas del arreglo después de guardar la configuración de esta manera ?.

Esto es lo que he intentado con 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)