2008-09-08 14 views
25

Tengo una serie de configuraciones de la aplicación (en el ámbito del usuario) para mi control de cuadrícula personalizado. La mayoría de ellos son configuraciones de color. Tengo un formulario donde el usuario puede personalizar estos colores y quiero agregar un botón para volver a la configuración de color predeterminada. ¿Cómo puedo leer la configuración predeterminada?Lectura de la configuración de la aplicación predeterminada en C#

Por ejemplo:

  1. tengo un ajuste de usuario llamado CellBackgroundColor en Properties.Settings.
  2. En el momento del diseño, establecí el valor de CellBackgroundColor en Color.White usando el IDE.
  3. El usuario establece CellBackgroundColor en Color.Black en mi programa.
  4. Guardo la configuración con Properties.Settings.Default.Save().
  5. El usuario hace clic en el botón Restore Default Colors.

Ahora, Properties.Settings.Default.CellBackgroundColor devuelve Color.Black. ¿Cómo vuelvo al Color.White?

Respuesta

33

@ozgur,

Settings.Default.Properties["property"].DefaultValue // initial value from config file 

Ejemplo:

string foo = Settings.Default.Foo; // Foo = "Foo" by default 
Settings.Default.Foo = "Boo"; 
Settings.Default.Save(); 
string modifiedValue = Settings.Default.Foo; // modifiedValue = "Boo" 
string originalValue = Settings.Default.Properties["Foo"].DefaultValue as string; // originalValue = "Foo" 
+0

Esto sólo funciona para los escalares. Tengo una propiedad que es del tipo System.Collections.Specialized.StringCollection. Al usar lo anterior, se devuelve el XML sin formato, lo que requiere que lo seleccione y cree la colección manualmente. –

1

¿Cómo puedo volver a Color.White?

dos maneras de hacerlo:

  • guardar una copia de la configuración antes de que el usuario cambie.
  • Guarde en caché la configuración modificada por el usuario y guárdela en Propiedades. Configuración antes de que se cierre la aplicación.
1

Tengo alrededor de este problema haciendo que 2 juegos de ajustes. Utilizo el que Visual Studio agrega de forma predeterminada para la configuración actual, es decir, Properties.Settings.Default. Pero también agrego otro archivo de configuración a mi proyecto "Proyecto -> Agregar nuevo elemento -> General -> Archivo de configuración" y almaceno los valores por defecto, es decir, Properties.DefaultSettings.Default.

Luego me aseguro de nunca escribir en la configuración Properties.DefaultSettings.Default, solo lea de ella. Cambiar todo a los valores predeterminados es simplemente el caso de volver a establecer los valores actuales en los valores predeterminados.

+0

También prefiero este enfoque, ya que llamar {Settings.Default.Properties ["Foo"] como cadena} puede dar como resultado una excepción si se cambia el nombre de la configuración. Además, el lanzamiento puede fallar. Creo que entre la duplicación de datos (predeterminado del usuario y la aplicación predeterminada) y tipo de seguridad, la duplicación es el mal menor aquí –

+0

BTW, asegurándose de nunca escribir en la configuración predeterminada es fácil: configure todos los ajustes allí con alcance de la aplicación, en lugar del ámbito del usuario –

10

Lectura "Windows 2.0 Formas de programación", yo tropezamos con estos 2 métodos útiles que pueden ser de ayuda en este contexto:

ApplicationSettingsBase.Reload

ApplicationSettingsBase.Reset

De MSDN:

Recargar contrasta con puesta en ese el primero cargará el último conjunto de valores de configuración de la aplicación guardados, mientras que el último cargará los valores predeterminados guardados .

lo tanto, el uso sería:

Properties.Settings.Default.Reset() 
Properties.Settings.Default.Reload() 
+0

Encuentro que "Recargar contrasta con Restablecer en que el primero cargará el último conjunto de valores guardados de la configuración de la aplicación, mientras que el segundo cargará los valores predeterminados guardados". no siempre es verdad P.ej. Después de .Guardar luego .Restablecer, .Reload no carga el conjunto guardado por .Guardar, no tiene efecto. – ChrisJJ

+0

¿Qué sucede si quiere restablecer solo una configuración y no todas? –

+0

@KyleDelaney parece que la respuesta de aku anterior permite eso (https://stackoverflow.com/a/49289/67824). –

2

Properties.Settings.Default.Reset() se restablecerá todos los ajustes a su valor original.

4

No estoy realmente seguro de que esto sea necesario, debe haber una manera más ordenada; de lo contrario, espero que alguien lo encuentre útil;

public static class SettingsPropertyCollectionExtensions 
{ 
    public static T GetDefault<T>(this SettingsPropertyCollection me, string property) 
    { 
     string val_string = (string)Settings.Default.Properties[property].DefaultValue; 

     return (T)Convert.ChangeType(val_string, typeof(T)); 
    } 
} 

uso;

var setting = Settings.Default.Properties.GetDefault<double>("MySetting"); 
+0

+1 Utilicé su respuesta como referencia al escribir la mía. –

0

me encontré con que llamar ApplicationSettingsBase.Reset tendría el efecto de restablecer los ajustes a sus valores predeterminados, sino también el ahorro de ellos al mismo tiempo.

El comportamiento que quería era restablecerlos a los valores predeterminados pero no guardarlos (de modo que si al usuario no le gustaban los valores predeterminados, hasta que se guardaran, podría revertirlos).

me escribió un método de extensión que era adecuado para mis propósitos:

using System; 
using System.Configuration; 

namespace YourApplication.Extensions 
{ 
    public static class ExtensionsApplicationSettingsBase 
    { 
     public static void LoadDefaults(this ApplicationSettingsBase that) 
     { 
      foreach (SettingsProperty settingsProperty in that.Properties) 
      { 
       that[settingsProperty.Name] = 
        Convert.ChangeType(settingsProperty.DefaultValue, 
             settingsProperty.PropertyType); 
      } 
     } 
    } 
} 
Cuestiones relacionadas