Speichern von ApplicationSettings zur Laufzeit

deadline

Erfahrenes Mitglied
Hi,
ich bin schon irgendwie am verzweifeln. Meine Anwendung ist quasi fertig und jetzt habe ich das Problem, dass ich meine Anwendungseinstellungen nicht speichern kann.
Habe sie über den Designer erstellt und ich greife über Properties.Settings.Default.MeinSetting zu.
Da ich während der Entwicklung die Settings immer über den Designer geändert habe ist mir das zuerst nicht aufgefallen, aber nach längerer Recherche hab ich rausgefunden, dass es gar nicht vorgesehen ist die ApplicationSettings zur Laufzeit zu speichern.

Jetzt meine Frage: Wie macht man das denn sonst? Benutzersettings sind schonmal ausgeschlossen, da das global für alle Benutzer gelten muss. Ich kann vom Benutzer nicht erwarten, dass er die XML Datei von Hand anpasst.

Oder stell ich mich einfach nur doof an?

Schonmal Danke für eure Antworten.

Grüße
Christian
 
Hallo Christian,

vielleicht versuchst du das ganze einfach per DataSet / DataTable in eine XML zu speichern, welche in deinem Applikationsverzeichnis liegt.

Hier sind mal 3 Youtube-Links, wo das ganz gut erklärt wird. Wenn alle Benutzer auf das gleicher Verzeichnis zugreifen, dann sollte dies so funktionieren.

Create / Write XML File Using DataTable / DataSet in C#
Read XML File Using DataTable DataSet in C#
C# - Login with a DataSet (tutorial)

Leider kann ich dir nicht sagen, wie das mit der Performance aussieht bzw. Mass-Multi-User.

Ich hoffe dies kann dir trotzdem ein wenig weiterhelfen.

Gruß
Hale

P.S.: Tut mir leid, dass das nur Youtube-Links sind und keine Artikel, aber bei denen, fand ich, wurde das am besten erklärt.
 
Hi,
danke für die schnelle Antwort. Ich würde auch eine Ini Datei hernehmen (habe dazu einen guten Reader genommen und angepasst). Der Vorteil von den Properties ist ja, dass man von überall darauf zugreifen kann, ohne dass man ein Objekt instanzieren muss (das wiederum die INI datei neu einliest). Kann man das mit der Ini Datei auch machen (bzw. mit dem Dataset), oder soll ich einfach einen umsetzer INI/XML -> Properties schreiben?
 
Hallo Christian,

du kannst dir einen neue abstrakte Klasse schreiben in welcher du dann nur 1 Objekt erstellst und somit die Sachen nicht immer wieder neu einliest.

Ein kleines Beispiel:
Code:
using System;
using System.Text;
using System.Drawing;
using System.Diagnostics;
using System.Collections;
using System.Windows.Forms;

namespace MeinNamespace
{
	public abstract class Obj
	{
		public static DataTable dtTable = new DataTable();
		// Hier kommen dann noch alle anderen Objekte hin
	}
}

Code:
using System;
using System.Text;
using System.Drawing;
using System.Diagnostics;
using System.Collections;
using System.Windows.Forms;

namespace MeinNamespace
{
	public class Form1 : Form
	{
		public void Meine Funktion()
		{
			//Hier kannst du dann deine Objekte ohne neue Instanzierung benutzen
			// Bsp.:
			Obj.dtTable...;
		}
	}
}

Leider kann ich dir nicht genau sagen, ob dies die beste Variante ist. Jedoch kann ich dir sagen, dass dies funktioniert, da ich bei mehreren Sachen solche (globalen) Variablen/Objekte benutze. Diese Variante dürfte natürlich auch mit Objekten deines Readers funktionieren.

Ich hoffe, dass dir dies weiterhilft. Ansonsten bei Fragen fragen.

Gruß
Hale
 
  1. Du benötigst ein Verzeichnis, in dem alle Benutzer Lese- und Schreibrechte haben. Dort kannst du eine Datei erstellen, in der programmweite Einstellungen gespeichert werden können.
  2. Stelle sicher, dass maximal 1 Benutzer die Datei zum Schreiben öffnet. Denke z.B. auch daran, dass sich ein anderer Benutzer per Remote einloggen könnte, während ein anderer am PC sitzt. Es könnte zum Konflikt kommen, wenn beide Benutzer gleichzeitig ihre Einstellungen speichern wollen.
  3. Um ein ähnliches Verhalten zu haben wie das My.Settings-Objekt, empfehle ich dir Serialisation, zum Beispiel mit XmlSerializer oder dem BinaryFormatter. Hier zwei Übersichtsartikel: XML and SOAP Serialization und Binary Serialization.
Mich würde der konkrete Anwendungsfall interessieren. Warum brauchst du Einstellungen, die für alle Benutzer gelten sollen und von allen veränderbar sein sollen?
 
Es ist ein Programm, welches über WMI Daten abruft und aufbereitet darstellt. Da das Programm keine Benutzerverwaltung hat kann zwangsläufig jeder, der das Programm aufmacht die Konfiguration ändern. In der Regel wird diese aber nur geändert, wenn z. B. ein Server dazu kommt oder wegfällt. Ansonsten fasst die Config keiner an.
Es müsste ja gehen, wenn ich in die Konfiguration reinschreibe, ob gerade Zugriff (schreibend) stattfindet.

Also nach dem Motto
[File]
isLocked=true

Und solange das drin steht kann nicht gespeichert werden. (Falls wirklich mal 2 Benutzer auf dem selben Rechner die Konfig editieren).
 
Das klingt für mich so, als wäre die Wahrscheinlichkeit, dass 2 Benutzer gleichzeitig eine Änderung durchführen, sehr niedrig, weil die Serverliste(?) nur selten geändert wird.

In der Konfigurationsdatei selbst zu speichern, ob diese gerade beschrieben wird, ist keine gute Idee. Besser ist das Anlegen einer zusätzlichen Datei ohne Inhalt. Falls diese zusätzliche Datei vorhanden ist, dann heißt das, das ein anderer Benutzer die Konfigurationsdatei gerade ändert. Falls keine zusätzliche Datei vorhanden ist, dann ändert gerade niemand die Konfigurationsdatei.

Noch besser ist aber einfach die Datei zum Schreiben so zu öffnen, dass andere Prozesse kein Zugriffsrecht mehr auf die Datei haben, siehe hier.

Da das Programm keine Benutzerverwaltung hat kann zwangsläufig jeder, der das Programm aufmacht die Konfiguration ändern.
Den Satz verstehe ich nicht. Die Benutzerverwaltung wird doch von Windows bereit gestellt; deine Anwendung braucht sich kaum darum zu kümmern. Was ist dein Ziel? Sollen alle Benutzer die Datei beschreiben können, oder sollen lediglich alle die Datei lesen können und nur ausgewählte Benutzer (z.B. Administratoren) die Datei beschreiben können?
 
Zuletzt bearbeitet:
Mit Benutzerverwaltung meine ich, dass das Programm keine eigenen Benutzer verwaltet. Man klickt drauf und es geht auf. In der Regel muss der Benutzer nur lesen, aber wenn sich etwas ändert soll er natürlich über das Einstellungsmenü die Einstellungen ändern können.
 
Hallo Christian,

hast du schon mal drüber nachgedacht, die Einstellungen in einer SQLite-Datenbank zu speichern? Die SQLite-DB unterstützt ca. 4-5 User gleichzeitig und ist eigentlich gut geeignet um Einstellungen abzuspeichern.

[Edit] Wenn du z.B. im Mozilla Firefox in der Browserleiste "about:config" eingibst, kannst du dort alle Einstellungen sehen. Diese werden auch in einer SQLite-DB abgespeichert. [/Edit]

In der DB kannst du auch Sachen ändern, jedoch kannst du nicht, wie bei einem XML, ohne zusätzliche Programme nachschauen was in der DB steht.

Gruß
Micha
 
Zuletzt bearbeitet:
Ist eine SQL Lite nicht überdimensioniert? Es handelt sich nur um 5 Einstellungen (Die wiederum meistens nur eine Liste sind).
 

Neue Beiträge

Zurück