문제

이 비어있는 비어있는 속성을 설정했습니다.

여기에 이미지 설명

그러나 새 ArrayList 개체를 속성에 할당 한 후에는 모든 응용 프로그램 실행에서 항상 항상 비어 있습니다.

mybase.load 이벤트의 핸들러 에서이 문제를 테스트하기 위해이 메소드에 대한 호출을 수행합니다.

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
.

위의 코드에서 볼 수 있듯이 하나의 항목이있는 새 ArrayList를 할당하지만 해당 앱 플리케이션 실행 중에만 변경 사항은 적용됩니다. 응용 프로그램에서 종료하면 속성이 다시 비어 있습니다.

및 또한이 옵션을 확인했습니다 :

여기에 이미지 설명

그러나 어쨌든 코드에서 설정 매뉴얼을 저장하기 때문에 불필요합니다.

왜 이것이 일어납니다.

어떻게이 문제를 해결할 수 있습니까?.

업데이트 :

조사를하고 배열, 배열 목록 및 모든 일반 컬렉션 (유형)을 My.Settings (그러나 다른 한편으로는 StringCollection CAN) 그러나 이 게시물 (메모리 스트림) 답변) ArrayList의 변경 사항을 My.Settings에 영구적으로 저장 한 다음 다음 응용 프로그램 실행에서 읽을 수있는 쉬운 방법을 설명합니다.

답변은 매우 좋지만 코드로 조금 잃어 버리고 일어나기위한 조치는 거기에서 설명 된 조치를 설명 할 수 있지만 저에게 인간이 읽을 수있는 언어로 제발?

ArrayList가 다음 응용 프로그램 실행에 남아 있음을 확인했습니다. 그렇지만 메모리 스트림이 오래된 ArrayList가 포함되어있는 경우에있는 원인이 확실하지 않습니다. .Settings.mru 더 많은 Arraylists 대신 String()가 포함 된 원래 ArrayList를 포함하는 ArsoriSlist로 설정하는 ArrayList로 설정하고 있으며,이 방법으로 설정을 저장 한 후 배열 항목을로드하는 방법은 무엇입니까?.

이것은 내가 그 대답에서 시도한 것입니다 :

' 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)
.

도움이 되었습니까?

해결책

ArrayList (또는 목록 또는 컬렉션)에 데이터가 있고 해결 방법의 BinaryFormatter를보고있는 경우 My.Settings도 사용할 수있는 좋은 이유가 없습니다. 파일을 저장하고 이름을 선택하는 BinaryFormatter를 통해 수행하는 작업을 수행 할 수 있습니다.

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)
.

설정 저장 :

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

로드 설정 :

' 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
.

해결 방법에 대한 bf에 의존해야 할 경우 메모리 스트림을 파일 스트림으로 교체하면 My.Settings의 필요성을 완전히 제거하고 원하는 위치에 파일을 저장할 수 있으며 버전별로 변경되지 않습니다. 버전별로 변경되지 않습니다. 위의 파일 이름 수식을 변경하지 않으면 exe 이름 또는 다른 항목입니다.

MRU ArrayList 만 있음에도 앱의 경우 모든 설정을 설정하는 위치에 모든 설정을 저장할 수있는 위치에 클래스를 사용할 수 있습니다. <Serializable>로 클래스에 태그를 지정해야합니다. 전체 클래스를 저장하는 한 줄의 코드가 하나씩 저장하여 재구성 할 수 있습니다. 몇 가지 제한이 있지만 극복하기가 어렵지 않습니다.

Private myNewSettings As New myNewSettingsClass
...

bf.Serialize(fs, myNewSettings)

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

다른 상황에서는 필요에 따라 XML Serializer 또는 Protobuf-Net을 사용할 수 있습니다.

프로그램이 종료 될 때 새 설정이 자동으로 저장할 수도 있습니다. 프로젝트 속성 -> 응용 프로그램 -> 응용 프로그램 이벤트보기 을 클릭하십시오. 왼쪽 메뉴에서 "응용 프로그램 이벤트"를 선택하고 오른쪽 이벤트 메뉴에서 종료 을 선택하십시오.

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

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

마찬가지로 Startup 이벤트에 자동으로로드 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top