Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I save application settings in a Windows Forms application?

What I want to achieve is very simple: I have a Windows Forms (.NET 3.5) application that uses a path for reading information. This path can be modified by the user, by using the options form I provide.

Now, I want to save the path value to a file for later use. This would be one of the many settings saved to this file. This file would sit directly in the application folder.

I understand three options are available:

  • ConfigurationSettings file (appname.exe.config)
  • Registry
  • Custom XML file

I read that the .NET configuration file is not foreseen for saving values back to it. As for the registry, I would like to get as far away from it as possible.

Does this mean that I should use a custom XML file to save configuration settings?

If so, I would like to see code example of that (C#).

I have seen other discussions on this subject, but it is still not clear to me.

like image 606
Fueled Avatar asked Jan 17 '09 11:01

Fueled


People also ask

Where are Windows Forms settings stored?

For a Windows Forms-based application copied onto the local computer, app.exe. config will reside in the same directory as the base directory of the application's main executable file, and user. config will reside in the location specified by the Application. LocalUserAppDataPath property.


2 Answers

If you work with Visual Studio then it is pretty easy to get persistable settings. Right click on the project in Solution Explorer and choose Properties. Select the Settings tab and click on the hyperlink if settings doesn't exist.

Use the Settings tab to create application settings. Visual Studio creates the files Settings.settings and Settings.Designer.settings that contain the singleton class Settings inherited from ApplicationSettingsBase. You can access this class from your code to read/write application settings:

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

This technique is applicable both for console, Windows Forms, and other project types.

Note that you need to set the scope property of your settings. If you select Application scope then Settings.Default.<your property> will be read-only.

Reference: How To: Write User Settings at Run Time with C# - Microsoft Docs

like image 73
aku Avatar answered Sep 26 '22 02:09

aku


If you are planning on saving to a file within the same directory as your executable, here's a nice solution that uses the JSON format:

using System; using System.IO; using System.Web.Script.Serialization;  namespace MiscConsole {     class Program     {         static void Main(string[] args)         {             MySettings settings = MySettings.Load();             Console.WriteLine("Current value of 'myInteger': " + settings.myInteger);             Console.WriteLine("Incrementing 'myInteger'...");             settings.myInteger++;             Console.WriteLine("Saving settings...");             settings.Save();             Console.WriteLine("Done.");             Console.ReadKey();         }          class MySettings : AppSettings<MySettings>         {             public string myString = "Hello World";             public int myInteger = 1;         }     }      public class AppSettings<T> where T : new()     {         private const string DEFAULT_FILENAME = "settings.json";          public void Save(string fileName = DEFAULT_FILENAME)         {             File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(this));         }          public static void Save(T pSettings, string fileName = DEFAULT_FILENAME)         {             File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(pSettings));         }          public static T Load(string fileName = DEFAULT_FILENAME)         {             T t = new T();             if(File.Exists(fileName))                 t = (new JavaScriptSerializer()).Deserialize<T>(File.ReadAllText(fileName));             return t;         }     } } 
like image 37
Trevor Avatar answered Sep 26 '22 02:09

Trevor