Pytanie może wydawać się zbyt banalne, a ja robię to samo, co sugerowano w artykułach, ale nie działa to zgodnie z oczekiwaniami. Mam nadzieję, że ktoś wskaże mi właściwy kierunek.
Chciałbym zapisać ustawienia użytkownika na AppSettings.
Po zamknięciu Winform uruchamiam to:
conf.Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if (ConfigurationManager.AppSettings["IntegrateWithPerforce"] != null)
ConfigurationManager.AppSettings["IntegrateWithPerforce"] =
e.Payload.IntegrateCheckBox.ToString();
else
config.AppSettings.Settings.Add("IntegrateWithPerforce",
e.Payload.IntegrateCheckBox.ToString());
config.Save(ConfigurationSaveMode.Modified);
Tak więc za pierwszym razem, gdy wpis jeszcze nie istnieje, po prostu go utworzy, w przeciwnym razie zmodyfikuje istniejący wpis. Jednak to nie oszczędza.
1) Co robię źle?
2) Gdzie oczekuję ponownego zapisania ustawień użytkownika dla ustawień aplikacji? Czy znajduje się w folderze Debug czy w folderze C: \ Documents and Settings \ NAZWA UŻYTKOWNIKA \ Ustawienia lokalne \ Dane aplikacji?
Odpowiedzi:
Być może powinieneś spojrzeć na dodanie pliku ustawień. (np. App.Settings) Utworzenie tego pliku pozwoli Ci wykonać następujące czynności:
string mysetting = App.Default.MySetting; App.Default.MySetting = "my new setting";
Oznacza to, że możesz edytować, a następnie zmieniać elementy, w których elementy są silnie wpisane, a co najważniejsze ... nie musisz dotykać żadnego pliku XML przed wdrożeniem!
Rezultatem jest ustawienie kontekstowe aplikacji lub użytkownika.
Zajrzyj do menu „dodaj nowy element” dla pliku ustawień.
źródło
Wiem, że się spóźniłem :) Ale tak to robię:
public static void AddOrUpdateAppSettings(string key, string value) { try { var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); var settings = configFile.AppSettings.Settings; if (settings[key] == null) { settings.Add(key, value); } else { settings[key].Value = value; } configFile.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name); } catch (ConfigurationErrorsException) { Console.WriteLine("Error writing app settings"); } }
Więcej informacji można znaleźć w witrynie MSDN
źródło
O tym, jak zmienić wartości w sekcji appSettings w pliku app.config:
config.AppSettings.Settings.Remove(key); config.AppSettings.Settings.Add(key, value);
wykonuje pracę.
Oczywiście lepszą praktyką jest lekcja ustawień, ale zależy to od tego, czego szukasz.
źródło
Wolę
<appSettings>
do<customUserSetting>
sekcji. O wiele łatwiej jest czytać ORAZ pisać za pomocą (Web) ConfigurationManager. ConfigurationSection, ConfigurationElement i ConfigurationElementCollection wymagają wyprowadzenia niestandardowych klas i zaimplementowania niestandardowych właściwości ConfigurationProperty. O wiele za dużo dla zwykłych zwykłych śmiertelników IMO.Oto przykład czytania i pisania w web.config:
using System.Web.Configuration; using System.Configuration; Configuration config = WebConfigurationManager.OpenWebConfiguration("/"); string oldValue = config.AppSettings.Settings["SomeKey"].Value; config.AppSettings.Settings["SomeKey"].Value = "NewValue"; config.Save(ConfigurationSaveMode.Modified);
Przed:
<appSettings> <add key="SomeKey" value="oldValue" /> </appSettings>
Po:
<appSettings> <add key="SomeKey" value="newValue" /> </appSettings>
źródło
ponieważ podstawowe pytanie dotyczy formularzy wygrywających, tutaj jest rozwiązanie: (Właśnie zmieniłem kod przez user1032413 na rflect windowsForms ustawienia) jeśli jest to nowy klucz:
Configuration config = configurationManager.OpenExeConfiguration(Application.ExecutablePath); config.AppSettings.Settings.Add("Key","Value"); config.Save(ConfigurationSaveMode.Modified);
jeśli klucz już istnieje:
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); config.AppSettings.Settings["Key"].Value="Value"; config.Save(ConfigurationSaveMode.Modified);
źródło
Spróbuj dodać to po zapisaniu połączenia.
ConfigurationManager.RefreshSection( "appSettings" );
źródło
Pamiętaj, że ConfigurationManager używa tylko jednego pliku app.config - takiego, który jest w projekcie startowym.
Jeśli umieścisz plik app.config w rozwiązaniu A i utworzysz odniesienie do niego z innego rozwiązania B, to jeśli uruchomisz B, plik app.config z A zostanie zignorowany.
Na przykład projekt testu jednostkowego powinien mieć własny plik app.config.
źródło
Myślę, że problem polega na tym, że w Visual Studio debugowania nie używaj normalnego exeName.
używa indtead „NameApplication” .host.exe
więc nazwa pliku konfiguracyjnego to „NameApplication” .host.exe.config, a nie „NameApplication” .exe.config
a po zamknięciu aplikacji - wraca do pliku app.config
więc jeśli zaznaczysz zły plik lub zaznaczysz zły czas, zobaczysz, że nic się nie zmieniło.
źródło
Możesz to zmienić ręcznie:
private void UpdateConfigFile(string appConfigPath, string key, string value) { var appConfigContent = File.ReadAllText(appConfigPath); var searchedString = $"<add key=\"{key}\" value=\""; var index = appConfigContent.IndexOf(searchedString) + searchedString.Length; var currentValue = appConfigContent.Substring(index, appConfigContent.IndexOf("\"", index) - index); var newContent = appConfigContent.Replace($"{searchedString}{currentValue}\"", $"{searchedString}{newValue}\""); File.WriteAllText(appConfigPath, newContent); }
źródło