654 Stimmen

Wie kann ich Anwendungseinstellungen in einer Windows Forms-Anwendung speichern?

Was ich erreichen möchte, ist sehr einfach: Ich habe eine Windows Forms (.NET 3.5) Anwendung, die einen Pfad zum Lesen von Informationen verwendet. Dieser Pfad kann vom Benutzer geändert werden, indem er das von mir bereitgestellte Optionsformular verwendet.

Nun möchte ich den Pfadwert zur späteren Verwendung in einer Datei speichern. Dies wäre eine der vielen Einstellungen, die in dieser Datei gespeichert werden. Diese Datei würde sich direkt im Anwendungsordner befinden.

Soweit ich weiß, gibt es drei Möglichkeiten:

  • KonfigurationsEinstellungsdatei (appname.exe.config)
  • Registry
  • Benutzerdefinierte XML-Datei

Ich habe gelesen, dass die .NET-Konfigurationsdatei nicht dafür vorgesehen ist, Werte in ihr zu speichern. Was die Registrierung betrifft, möchte ich so weit wie möglich davon wegkommen.

Bedeutet dies, dass ich eine benutzerdefinierte XML-Datei verwenden sollte, um die Konfigurationseinstellungen zu speichern?

Wenn ja, würde ich gerne ein Codebeispiel dafür sehen (C#).

Ich habe andere Diskussionen zu diesem Thema gesehen, aber es ist mir immer noch nicht klar.

6voto

kite Punkte 1370

Andere Optionen: Statt einer benutzerdefinierten XML-Datei können wir ein benutzerfreundlicheres Dateiformat verwenden: JSON- oder YAML-Datei.

  • Wenn Sie .NET 4.0 dynamic verwenden, ist diese Bibliothek wirklich einfach zu benutzen (Serialisierung, Deserialisierung, Unterstützung von verschachtelten Objekten und Anordnung der Ausgabe nach Wunsch + Zusammenführen mehrerer Einstellungen zu einer) JsonConfig (die Verwendung entspricht der von ApplicationSettingsBase)
  • Für .NET YAML Konfigurationsbibliothek... Ich habe keine gefunden, die so einfach zu benutzen ist wie JsonConfig

Sie können Ihre Einstellungsdatei in mehreren speziellen Ordnern speichern (für alle Benutzer und pro Benutzer), wie hier aufgeführt Environment.SpecialFolder Aufzählung und mehrere Dateien (standardmäßig schreibgeschützt, pro Rolle, pro Benutzer, usw.)

Wenn Sie mehrere Einstellungen verwenden möchten, können Sie diese Einstellungen zusammenführen: Zum Beispiel können Sie die Einstellungen für Standard + BasicUser + AdminUser zusammenführen. Sie können Ihre eigenen Regeln verwenden: Die letzte Einstellung hat Vorrang vor dem Wert, usw.

4voto

Jacob Punkte 21787

Soweit ich das beurteilen kann, unterstützt .NET die Speicherung von Einstellungen mit Hilfe der integrierten Anwendungseinstellungen:

Mit der Funktion Anwendungseinstellungen von Windows Forms lassen sich benutzerdefinierte Anwendungs- und Benutzereinstellungen auf dem Client-Computer leicht erstellen, speichern und pflegen. Mit den Windows Forms-Anwendungseinstellungen können Sie nicht nur Anwendungsdaten, wie z. B. Datenbankverbindungszeichenfolgen, sondern auch benutzerspezifische Daten, wie z. B. Benutzeranwendungseinstellungen, speichern. Mithilfe von Visual Studio oder benutzerdefiniertem verwaltetem Code können Sie neue Einstellungen erstellen, sie von der Festplatte lesen und auf die Festplatte schreiben, sie an Eigenschaften in Ihren Formularen binden und Einstellungsdaten vor dem Laden und Speichern validieren. - http://msdn.microsoft.com/en-us/library/k4s6c3a0.aspx

3voto

user3130351 Punkte 75

Manchmal möchten Sie die Einstellungen, die in der herkömmlichen web.config- oder app.config-Datei gespeichert sind, loswerden. Sie möchten eine feinere Kontrolle über die Bereitstellung Ihrer Einstellungseinträge und eine getrennte Datengestaltung. Oder die Anforderung besteht darin, das Hinzufügen neuer Einträge zur Laufzeit zu ermöglichen.

Ich kann mir zwei gute Optionen vorstellen:

  • Die stark typisierte Version und
  • Die objektorientierte Version.

Der Vorteil der stark typisierten Version sind die stark typisierten Namen und Werte der Einstellungen. Es besteht keine Gefahr der Vermischung von Namen oder Datentypen. Der Nachteil ist, dass mehr Einstellungen kodiert werden müssen und nicht zur Laufzeit hinzugefügt werden können.

Bei der objektorientierten Version besteht der Vorteil darin, dass neue Einstellungen zur Laufzeit hinzugefügt werden können. Aber Sie haben keine stark typisierten Namen und Werte. Man muss mit String-Bezeichnern vorsichtig sein. Man muss den zuvor gespeicherten Datentyp kennen, wenn man einen Wert erhält.

Sie finden den Code beider voll funktionsfähigen Implementierungen HIER .

2voto

public static class SettingsExtensions
{
    public static bool TryGetValue<T>(this Settings settings, string key, out T value)
    {
        if (settings.Properties[key] != null)
        {
            value = (T) settings[key];
            return true;
        }

        value = default(T);
        return false;
    }

    public static bool ContainsKey(this Settings settings, string key)
    {
        return settings.Properties[key] != null;
    }

    public static void SetValue<T>(this Settings settings, string key, T value)
    {
        if (settings.Properties[key] == null)
        {
            var p = new SettingsProperty(key)
            {
                PropertyType = typeof(T),
                Provider = settings.Providers["LocalFileSettingsProvider"],
                SerializeAs = SettingsSerializeAs.Xml
            };
            p.Attributes.Add(typeof(UserScopedSettingAttribute), new UserScopedSettingAttribute());
            var v = new SettingsPropertyValue(p);
            settings.Properties.Add(p);
            settings.Reload();
        }
        settings[key] = value;
        settings.Save();
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X