Puede sonar demasiado trivial para preguntar y hago lo mismo que se sugiere en los artículos, pero no funciona como se esperaba. Espero que alguien pueda señalarme la dirección correcta.
Me gustaría guardar la configuración de usuario por AppSettings.
Una vez que el Winform está cerrado, activo esto:
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);
Entonces, la primera vez que la entrada aún no existe, simplemente la crearía, de lo contrario, modificaría la entrada existente. Sin embargo, esto no salva.
1) ¿Qué estoy haciendo mal?
2) ¿Dónde espero que se guarden de nuevo los ajustes de usuario para la configuración de la aplicación? ¿Está en la carpeta Debug o en la carpeta C: \ Documents and Settings \ USERNAME \ Local Settings \ Application Data?
Respuestas:
Quizás debería considerar agregar un archivo de configuración. (por ejemplo, App.Settings) La creación de este archivo le permitirá hacer lo siguiente:
string mysetting = App.Default.MySetting; App.Default.MySetting = "my new setting";
Esto significa que puede editar y luego cambiar elementos, donde los elementos están fuertemente tipados, y lo mejor de todo ... ¡no tiene que tocar ningún xml antes de implementar!
El resultado es una configuración contextual de Aplicación o Usuario.
Eche un vistazo en el menú "agregar nuevo elemento" para el archivo de configuración.
fuente
Sé que llego tarde :) Pero así es como lo hago:
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"); } }
Para obtener más información, consulte MSDN
fuente
Sobre cómo cambiar valores en la sección appSettings en su archivo app.config:
config.AppSettings.Settings.Remove(key); config.AppSettings.Settings.Add(key, value);
hace el trabajo.
Por supuesto, una mejor práctica es la clase de Configuración, pero depende de lo que busques.
fuente
Prefiero
<appSettings>
a<customUserSetting>
la sección. Es mucho más fácil leer Y escribir con ConfigurationManager (Web). ConfigurationSection, ConfigurationElement y ConfigurationElementCollection requieren que derive clases personalizadas e implemente propiedades de ConfigurationProperty personalizadas. Demasiado para los simples mortales cotidianos, en mi opinión.Aquí hay un ejemplo de lectura y escritura en 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);
Antes de:
<appSettings> <add key="SomeKey" value="oldValue" /> </appSettings>
Después:
<appSettings> <add key="SomeKey" value="newValue" /> </appSettings>
fuente
como la pregunta básica es sobre formularios win, aquí está la solución: (acabo de cambiar el código del usuario 1032413 para reflejar la configuración de windowsForms) si es una nueva clave:
Configuration config = configurationManager.OpenExeConfiguration(Application.ExecutablePath); config.AppSettings.Settings.Add("Key","Value"); config.Save(ConfigurationSaveMode.Modified);
si la clave ya existe:
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); config.AppSettings.Settings["Key"].Value="Value"; config.Save(ConfigurationSaveMode.Modified);
fuente
Intente agregar esto después de guardar la llamada.
ConfigurationManager.RefreshSection( "appSettings" );
fuente
Recuerde que ConfigurationManager usa solo un app.config, uno que está en el proyecto de inicio.
Si coloca algún app.config en una solución A y hace una referencia a él desde otra solución B, entonces si ejecuta B, se ignorará app.config de A.
Entonces, por ejemplo, el proyecto de prueba unitaria debería tener su propia app.config.
fuente
Creo que el problema es que en el debug Visual Studio no se usa el exeName normal.
utiliza en lugar de "NameApplication" .host.exe
por lo que el nombre del archivo de configuración es "NameApplication" .host.exe.config y no "NameApplication" .exe.config
y después de cerrar la aplicación, vuelve a la aplicación posterior.
por lo tanto, si comprueba el archivo incorrecto o la hora incorrecta, verá que no ha cambiado nada.
fuente
Puede cambiarlo manualmente:
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); }
fuente