2012-03-08 4 views
5

меня возникают некоторые проблемы с сохранением настроек приложения во время выполнения ...WinForm-х Настройки приложения: не может сохранить настройки приложения, которые были добавлены во время выполнения

Если я изменить область настройки для пользователя, он отлично работает , но в рамках приложения, ничего не случилось быть ...

Я использовал:

Properties.Settings.Default.Save(); 

какие-нибудь идеи?

благодарит

+1

По дизайну только ваши настройки могут быть изменены с помощью кода. Вы изменяете настройки области приложения, редактируя файл .config. Обычно для привилегий администратора требуется доступ к записи для файла. –

ответ

10

Это потому, что установка области применения в приложение делает его доступным только для чтения.

См Using Settings in C#

настройки области приложения доступны только для чтения, и может быть изменен только во время разработки или изменения файла .exe.config между сессиями приложений. Однако параметры пользовательской области можно записать во время выполнения, так же, как вы изменили бы значение свойства. Новое значение сохраняется в течение всего сеанса приложения. Вы можете сохранить изменения пользовательских настроек между сеансами приложений, вызвав метод Settings.Save.

1

Вы можете сохранять и читать настройки, как и все передовые программы в реестре, и как это сделать:

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 

Или еще вы можете сделать сериализации класса ([Сериализуемым()]), который содержит все ваши настройки в качестве свойств, а затем сохранит их в каталоге приложений с классом 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

Возможно, я не объяснил себя правильно, я не использую реестр, но Properties.Settings.Default.Save(); – Igal

+0

Нет, я знаю, что 'Properties.Settings' является болью, поэтому я даю 2 других варианта, чтобы сохранить настройки приложения: реестр или двоичный файл –

+0

oh, я вижу :), но это я вроде как проблема ... приложение уже реализовано используя Properties.Settings, поэтому я не могу изменить его сейчас – Igal

0

Проверьте this post. Вы просто ссылаетесь на настройки области приложения следующим образом:

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

Работает для меня.