2012-03-08 13 views
5

ja mając pewne problemy z zapisywania ustawień aplikacji w czasie wykonywania ...winform na Ustawienia aplikacji: nie można zapisać ustawienia aplikacji, które zostały dodane w czasie wykonywania

Jeśli zmienić zakres ustawień dla użytkownika, to działa dobrze , ale w zakresie aplikacji, nic nie jest się ...

Użyłem:

Properties.Settings.Default.Save(); 

jakieś pomysły?

dzięki

+1

Zgodnie z projektem, tylko ustawienia z zakresem użytkownika mogą być modyfikowane przez twój kod. Zmieniasz ustawienia zakresu aplikacji, edytując plik .config. Co zwykle wymaga uprawnień administratora, aby uzyskać prawo zapisu do pliku. –

Odpowiedz

10

Dzieje się tak, ponieważ ustawienie zakresu na Aplikacja powoduje, że jest on tylko do odczytu.

Zobacz Using Settings in C#

ustawienia Application-SCOPE są tylko do odczytu, i mogą być zmieniane tylko w czasie projektowania lub zmieniając plik w .exe.config między sesjami aplikacji. Ustawienia zakresu użytkownika można jednak zapisywać w czasie wykonywania, tak jak w przypadku zmiany dowolnej wartości właściwości. Nowa wartość utrzymuje się przez cały czas trwania sesji aplikacji. Możesz zachować zmiany w ustawieniach użytkownika między sesjami aplikacji, wywołując metodę Settings.Save.

1

można zapisać i odczytać ustawienie jak wszystkie zaawansowanych programów w rejestrze, a to jest, jak to zrobić:

Public Function GetRegistryValue(ByVal KeyName As String, Optional ByVal DefaultValue As Object = Nothing) As Object 
     Dim res As Object = Nothing 
     Try 
      Dim k = My.Computer.Registry.CurrentUser.OpenSubKey("Software\YourAppName", True) 
      If k IsNot Nothing Then 
       res = k.GetValue(KeyName, DefaultValue) 
      Else 
       k = My.Computer.Registry.CurrentUser.CreateSubKey("Software\YourAppName") 
      End If 
      If k IsNot Nothing Then k.Close() 
     Catch ' ex As Exception 
      'PromptMsg(ex) 
     End Try 
     Return res 
    End Function 

    Public Sub SetRegistryValue(ByVal KeyName As String, ByVal _Value As Object) 
     Try 
      Dim k = My.Computer.Registry.CurrentUser.OpenSubKey("Software\YourAppName", True) 
      If k IsNot Nothing Then 
       k.SetValue(KeyName, _Value) 
      Else 
       k = My.Computer.Registry.CurrentUser.CreateSubKey("Software\YourAppName") 
       k.SetValue(KeyName, _Value) 
      End If 
      If k IsNot Nothing Then k.Close() 
     Catch ' ex As Exception 
      'PromptMsg(ex) 
     End Try 
    End Sub 

lub nawet więcej można zrobić serializacji klasy ([Serializable()] attrib), który zawiera wszystkie twoje ustawienia jako właściwości, a następnie zapisz je w katalogu aplikacji za pomocą klasy BinaryFormatter.

Public Sub saveBinary(ByVal c As Object, ByVal filepath As String) 
     Try 
      Using sr As Stream = File.Open(filepath, FileMode.Create) 
       Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter() 
       bf.Serialize(sr, c) 
       sr.Close() 
      End Using 
     Catch ex As Exception 
      Throw ex 
     End Try 
    End Sub 

    Public Function loadBinary(ByVal path As String) As Object 
     Try 
      If File.Exists(path) Then 
       Using sr As Stream = File.Open(path, FileMode.Open) 
        Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter() 
        Dim c = bf.Deserialize(sr) 
        sr.Close() 
        Return c 
       End Using 
      Else 
       Throw New Exception("File not found") 
      End If 
     Catch ex As Exception 
      Throw ex 
     End Try 
     Return Nothing 
    End Function 
+0

Może nie wyjaśniłem się poprawnie, nie używam rejestru, ale Properties.Settings.Default.Save(); – Igal

+0

Nie, wiem, że 'Properties.Settings' to ból, więc daję 2 inne opcje, aby zapisać ustawienia aplikacji: Registry lub plik binarny –

+0

oh, widzę :) ale ten rodzaj problemu ... aplikacja została już zaimplementowana za pomocą Properties.Settings, więc nie mogę go teraz zmienić – Igal

0

Sprawdzić this post na zewnątrz. Wystarczy zapoznać się z ustawieniami o zasięgu określonym w tej aplikacji:

Properties.Settings.Default["SomeProperty"] = "Some Value"; 
Properties.Settings.Default.Save(); // Saves settings in application configuration file 

Pracowałem dla mnie.

Powiązane problemy