Einstellungen (Settings.settings) speichern

  • C#

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    Einstellungen (Settings.settings) speichern

    Sorry, ich weiß, dass ich nerven kann, hilft ja aber nichts. Ich lese jetzt seit gut 10 Stunden Seiten wie diese hier um ein kleines(?) Problem zu lösen. Dabei mach ich alles so, wie beschrieben.
    Ich brauche zwei Dateien für Settings (außer der Settings.setting, die es aber auch nicht macht). Also hab ich mir zwei Einstellungsdateien erstellt. Es fängt ja schon damit an, dass man die von Hand schreiben muss, weil sie über Properties -> Öffnen nicht auftauchen. Ok, nicht das Problem, schreibt man die Felder in die Settings.setting und kopiert sie von da in die benötigte Datei. Aber keine der drei Dateien speichern auch nur irgendwas.

    C#-Quellcode

    1. private void btn_Conn_Speichern_Click(object sender, EventArgs e)
    2. {
    3. try
    4. {
    5. Properties.Server.Default.dbServer = tb_Server.Text;
    6. Properties.Server.Default.Port = tb_Port.Text;
    7. Properties.Server.Default.User = tb_Benutzer.Text;
    8. Properties.Server.Default.Passwort = tb_Password.Text;
    9. Properties.Server.Default.Datenbank = tb_Datenbank.Text;
    10. Properties.Server.Default.Save();
    11. }
    12. catch (Exception ex)
    13. {
    14. MessageBox.Show(ex.Message);
    15. }
    16. }


    Da sollte man doch eigentlich nichts falsch machen können, oder doch? Es passiert gar nichts, versteh ich nicht. Es gibt auch keinerlei Fehlermeldungen. Ich will in diese Datei die Daten für den Server schreiben und später (also wahrscheinlich sehr viel später) verschlüsseln. In eine zweite Datei sollen nur die Login-Daten (userID und User), die sollen bei verlassen des Programms wieder auf null gesetzt werden. Aber wenn die Dinger nix speichern ...

    //edit
    Und jetzt fällt mir grad auf, dass ich die Dinger auch nicht auslesen kann.

    C#-Quellcode

    1. if (Properties.Server.Default.dbServer.Length == 0 | Properties.Server.Default.dbServer == "A")
    2. {
    3. Application.Run(new frmSetupUpdateMySQLServer());
    4. }
    5. else
    6. {
    7. Application.Run(new frmMain());
    8. }


    Er kommt direkt beim frmMain an (hab zum ausprobieren einfach von Hand ein "A" in die Datei geschrieben).

    Grüße aus Berlin
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Hatori“ ()

    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Ja, was hab ich geschrieben?
    Ich brauche zwei Dateien für Settings (außer der Settings.setting, die es aber auch nicht macht). Also hab ich mir zwei Einstellungsdateien erstellt.

    Die eine heißt LoginSettings.settings und die, auf die sich meine Code-Zeilen beziehen, heißt Server.settings. Es wird von VS auch nicht der Code bemängelt, er findet mit Intellicense auch alles, ich muss es nicht tippen. Nur gespeichert und gelesen wird eben mal so gar nichts, weder in Settings.settings noch in LoginSettings.settings noch in Settings.settings.

    Aus Deinem Beispiel:

    C#-Quellcode

    1. Properties.Settings.Default.Position = Location;
    2. Properties.Settings.Default.Save();


    Genau das mache ich doch, nur eben nicht mit der Settings.settings, sondern mit der Server.settings. Aber auch in der Settings.settings wird nichts gespeichert.

    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Ich hab das Settings.Save nicht im MainForm, sondern noch höher aufgehängt: in Program.Main() - übrigens in jeder meiner Solutions:

    C#-Quellcode

    1. static class Program {
    2. /// <summary>
    3. /// Der Haupteinstiegspunkt für die Anwendung.
    4. /// </summary>
    5. [STAThread]
    6. static void Main() {
    7. Application.EnableVisualStyles();
    8. Application.SetCompatibleTextRenderingDefault(false);
    9. Application.Run(new FormTest());
    10. Properties.Settings.Default.Save();
    11. }
    12. }
    Dann braucht Form_Closing sich nur um sein Sach zu kümmern:

    C#-Quellcode

    1. protected override void OnFormClosing(FormClosingEventArgs e) {
    2. Properties.Settings.Default.Position = Location;
    3. }


    Application.Exit() braucht man garnet.
    Offensichtlich benutzt du nicht die Settings, die ohnehin da sind. Ich weiß, dass hier im Forum auch schon von anderen als den Standardsettings geschrieben wurde, kam für mich nur nie in Frage.
    Wenn ich mehr oder was aufwendigeres habe, dann nehme ich ein Dataset (über Designer, als streng typisiert) und speichere darüber Einstellungen. Da muss man sich dann natürlich ums Laden und Speichern auch selbst kümmern, aber ist dann auch richtig flexibel. Laden und speichern sind kaum mehr als Einzeiler also im Grunde auch immer noch extrem übersichtlich.

    ErfinderDesRades schrieb:

    Ich hab das Settings.Save nicht im MainForm, sondern noch höher aufgehängt: in Program.Main() - übrigens in jeder meiner Solutions:

    ErfinderDesRades schrieb:

    Ich hab das Settings.Save nicht im MainForm, sondern noch höher aufgehängt: in <code class="inlineCode">Program.Main()</code> - übrigens in <span style="text-decoration: underline"><i><b>jeder</b></i></span> meiner Solutions:C#-Quellcode (12 Zeilen)Dann braucht Form_Closing sich nur um sein Sach zu kümmern:C#-Quellcode (3 Zeilen)

    <code class="inlineCode"></code>…


    Werd ich mich auch dran gewöhnen, macht absolut Sinn, danke.

    Dksksm schrieb:

    Offensichtlich benutzt du nicht die Settings, die ohnehin da sind. Ich weiß, dass hier im Forum auch schon von anderen als den Standardsettings geschrieben wurde, kam für mich nur nie in Frage.
    Wenn ich mehr oder was aufwendigeres habe, dann nehme ich…


    Alles andere kann ja auch dann in die Settings. In die Server.settings kommen nur die Zugangsdaten zur Datenbank, weil ich die zum Laufzeitende verschlüsseln will/muss und beim Programmaufruf wieder entschlüsseln. Und in die LoginSettings sollen die Login-Daten (User und userID), damit ich die innerhalb des Programms schnell zur Verfügung habe (wegen der Rechtevergabe für verschiedene Benutzer). Ja, ich weiß, ginge mit großer Wahrscheinlichkeit auch deutlich einfacher, was solls, ich mach das erst knapp zwei Wochen und ein 62-jähriges Hirn ist halt ein wenig langsamer im Denken ;) :)
    Letztendlich auch egal, auch in der Settings.settings krieg ich in der Laufzeit nichts gespeichert oder ausgelesen.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    @Hatori Du musst nicht unbedingt die .NET-Settings verwenden, Du kannst das auch separat behandeln:
    XML: Problem bei der Eintragung der Daten in XML
    Ich hab auch mehrere Settings-Dateien. Üblicherweise eine für Nutzer-Einstellungen im Programm, eine für Fensterpositionen und ggf. welche für z.B. Kameraparameter, letztere sind exemplar-spezifisch, d.h. der Kamera-Typ und die Seriennummer sind Bestandteil des Dateinamens.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich raffs nicht :( Hab das ganze Teil nochmal angefangen, komplett neu.

    C#-Quellcode

    1. private void btnSpeichernSetup_Click(object sender, EventArgs e)
    2. {
    3. if(tbServer.Text.Length == 0 || tbPort.Text.Length == 0 || tbBenutzer.Text.Length == 0 || tbPassword.Text.Length == 0)
    4. {
    5. string msg = "Bitte alle Felder ausfüllen!";
    6. MessageBox.Show(msg);
    7. }
    8. else
    9. {
    10. try
    11. {
    12. Properties.ServerSetup.Default.Server = tbServer.Text;
    13. Properties.ServerSetup.Default.Port = tbPort.Text;
    14. Properties.ServerSetup.Default.User = tbBenutzer.Text;
    15. Properties.ServerSetup.Default.Passwort = tbPassword.Text;
    16. Properties.ServerSetup.Default.Save();
    17. try
    18. {
    19. MySqlConnection connTest = DBUtilsTest.GetDBConnection();
    20. connTest.Open();
    21. string msg = "Verbindung erfolgreich";
    22. MessageBox.Show(msg);
    23. connTest.Close();
    24. this.groupBoxVerein.Visible = true;
    25. }
    26. catch (Exception ex)
    27. {
    28. MessageBox.Show(ex.Message);
    29. }
    30. }
    31. catch (Exception ex)
    32. {
    33. MessageBox.Show(ex.Message);
    34. }
    35. }
    36. }


    Das "database" fehlt, liegt daran, dass die erst im nächsten Schritt erstellt wird, dazu muss ich aber mit dem erst klarkommen. Es wird erfolgreich eine Verbindung hergestellt, aber die Properties werden nicht gespeichert. Ich habs auch in der Standard.settings versucht. Klar, wenn ich sie von Hand eintrage, gehts, aber sie müssen aus dem Formular heraus gespeichert werden ... und das eben geht nicht. Ich hab mir den Beitrag, den Rod verlinkt hat, angesehen, da versteh ich allerdings nur Bahnhof.
    Wo ist der Unterschied von meinem Code zu Deinem? Die Properties sind

    Quellcode

    1. {get; set;}
    , die muss ich doch nicht extra irgendwie behandeln, oder? Wenn jemand Zeit und Lust hat, könnte er ja mal einen Blick werfen:
    github.com/TrueHatori/Vereinsverwaltung vielleicht seh ich nur den Wald vor Bäumen nicht.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Was da steht, werden die Verbindungsdaten zur Datenbank (MySql.Data.MySqlClient, fürs Speichern der Properties nicht benutzt, der wird erst beim Zugriff auf die MySQL-Datenbank gebraucht), die brauch ich sofort gespeichert, denn das ist mein Hauptarbeitsmittel. Ich brauch praktisch ständig Verbindung. Und die Klasse holt sich diese Daten aus den Properties. Ich kann die nicht in den "normalen" Settings speichern, da ist ein Passwort dabei und das Programm soll netzwerkfähig sein, heißt, es arbeiten mehreren Leute auf verschiedenen PCs damit. Ja, man könnte das komplette Ding verschlüsseln. Spielt aber keine Rolle, er speichert ja nirgends, in keiner der drei *.settings.
    Außerdem nervt es mich extremst, wenn so ein mistiges Teil nicht so will wie ich will :D Ich hab heute nochmal stundenlang gesucht, überall, wo ich gucke, steht es genau so, wie es da aufgeschrieben steht.
    Und wieso krieg ich eine Verbindung zur DB, wenn die Dinger doch nicht gespeichert werden? Man, in PHP ist das so schön einfach, aber nee, ich muss ja C# anfangen ... im Browser läuft die Vereinsverwaltung komplett und Fehlerlos. Nun dachte ich mir, schreib ich mir mal eben noch ne Windows-Oberfläche dafür. Manchmal hab ich einfach zuviel Zeit ;) Jetzt hab ich das angefangen, jetzt krieg ich das auch irgendwie hin. Aber erstmal muss das Teil diese dämlichen Proberties speichern.
    Was ich mal so gar nicht verstehe: Ich hab Visual Studio geschlossen, den PC neu gestartet, ich muss die Verbindungsdaten trotzdem nicht mehr eingeben. Wo zum Henker, nimmt der die jetzt her???

    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Hatori“ ()

    Dein Programm wirft weit über 100 Fehler, erst wenn man die NuGet Pakete aktualisiert sind die meisten weg, soweit so gut. Nur deine MySql.Data halt nicht. Installiere ich dann das NuGet Paket von Hand nach, handle ich mir neue Fehler ein. Daher ist dein Programm für mich ohne erheblichen Aufwand auch nicht lauffähig.
    Dein Settings-Problem-Code hängt aber mitten in einer Funktion, die nun mal einen gültigen MySql.Data Verweis benötigt.
    Ich kann deinen Code daher einfach nicht laufen lassen.
    Mach doch ein Testprojekt was sich ausschliesslich um diese Geschichte mit der nicht in den Standardsettings befindlichen Einstellungen nachstellt ohne zig andere DLLs zu benötigen.
    Die Mysql-Funktionen fangen doch erst nach dem Speichern der Settings an (im inneren try-catch-Block), bis dahin passiert damit gar nichts. Bevor irgendein Zugriff auf MySql passiert, sollen buw. müssen die gespeichert sein. Das passiert aber nicht und es gibt auch keine Fehlermeldung.
    Ich mach morgen mal ein Dingens ohne MySql, ich denke aber nicht, dass sich da was ändert. Fehler hab ich keine bei mir, es läuftbis dahin, wo dann die zweite Groupbox sichtbar gemacht wird

    Quellcode

    1. this.groupBoxVerein.Visible = true;
    Weiter gehts noch nicht, im nächsten Schritt soll dann der Vereinsname eingegeben werden und aus dem mit Trim und toLower der Nam eder Datenbank generiert, die Datenbank erstellt und mit Tabellen gefüllt werden. Alles kein Ding, aber erst müssen die Settings gespeichert werden.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    Geht doch, dieses Projekt läuft.
    Jetzt habe ich mal eine Logikfrage:
    Wie kommst Du auf die Idee, dass die Textboxen von alleine wissen können, was in den Settings steht?
    Du speicherst schon immer alles ganz brav ab, nur nützt Dir das nichts weil du den TBs ja nie sagst, wie der Wert der jeweiligen Setting ist.
    Übrigens, dass gespeichert wird kannst Du auch im Filesystem leicht prüfen. Schau mal unter %LOCALAPPDATA%\OnlyATest und dann dem generierten Pfad weiter, nach.

    Du müsstest zumindest einmal zum Programmstart den Textboxen sagen, was sie anzeigen sollen:

    C#-Quellcode

    1. private void Form1_Shown(object sender, EventArgs e)
    2. {
    3. tbServer.Text = Properties.ServerSetup.Default.Server;
    4. tbPort.Text = Properties.ServerSetup.Default.Port;
    5. tbBenutzer.Text = Properties.ServerSetup.Default.User;
    6. tbPassword.Text = Properties.ServerSetup.Default.Passwort;
    7. }


    Nachtrag: In deinem ersten Post habe ich jetzt erst noch einen "kleinen" Fehler entdeckt:

    C#-Quellcode

    1. if (Properties.Server.Default.dbServer.Length == 0 | Properties.Server.Default.dbServer == "A")
    2. {
    3. Application.Run(new frmSetupUpdateMySQLServer());
    4. }
    5. else
    6. {
    7. Application.Run(new frmMain());
    8. }

    müsste wohl eher so aussehen:

    C#-Quellcode

    1. if (Properties.Server.Default.dbServer.Length == 0 || Properties.Server.Default.dbServer == "A")
    2. {
    3. Application.Run(new frmSetupUpdateMySQLServer());
    4. }
    5. else
    6. {
    7. Application.Run(new frmMain());
    8. }

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Dksksm“ ()

    Moin,
    jetzt bin ich endgültig verwirrt. Ja, in dem Pfad gibts eine user.config, da steht alles drin, aber wieso? Er soll das doch in die settings-Datei speichern und genau das tut er eben nicht. Ok, ich könnte jetzt damit zufrieden sein, bin ich aber nicht, weil ich (noch) nicht weiß, wieso, weshalb, warum. Irgendwie hab ich wohl Windows noch nicht verstanden bzw. die Programmlogik. Ich sag, das Programm soll in die settings-Datei speichern, es speichert aber ganz woanders. Vielleicht sollte ich das erstmal verstehen. Aber danke für den Moment.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de

    Hatori schrieb:

    Ich sag, das Programm soll in die settings-Datei speichern, es speichert aber ganz woanders.
    AFAIK sagst du allenfalls, das Programm soll die Settings speichern. Wohin sagst du nicht.
    Das Programm speichert die Settings tatsächlich an einen sehr gewöhnungsbedürftigen Ort - aber man kann sich dran gewöhnen.
    Der Grund ist, dass wo du denkst, wo die Settings stehen sollten - da besteht evtl. kein Schreibrecht.
    Also bei dir schon, du entwickelst ja mit Admin-Rechten.
    Aber wenn das Proggi mal mit einem Setup ausgeliefert wird, und ins Windows\Program\ - verzeichnis installiert - dann gibts da keine Schreibrechte, und es speichert in UserAppData.
    Versteh ich. Mein Fehler liegt wohl darin, dass ich der Meinung war, es würde in der Entwicklungsumgebung eben in die Datei *.settings gespeichert, was aber wohl nicht der Fall ist. Da stehen scheinbar nur die Platzhalter für die spätere tatsächliche Speicherung drin. Auf sowas muss man bei PHP nicht achten, hier sollte man diesen Punkt erstmal verstehen, dann klappts auch :) Danke jedenfalls, das scheint erledigt zu sein, mal sehen, wann das nächste Problem auftaucht :D
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    Eine Frage hab ich noch: Ich will auch die Datenbanktabellen über das Programm anlegen. Nun will ich aber nicht 229 Zeilen SQL-Code in das Programm schreiben (zumal die ja nur ein einziges Mal gebraucht werden), sondern das aus einer Datei einlesen. Wie das geht, weiß ich, nur muss ich die ja mitliefern. Wo packe ich die denn hin, damit sie auch wirklich bei der endgültigen Kompilierung mit in den entsprechenden Ordner kommt und dann bei der Installation auch eingelesen wird? Oder kann ich die liegenlassen, wo sie liegt und das Programm holt sie sich dann selbst?
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    Du könntest die Datei in die Ressourcen aufnehmen und dann gezielt in ein zu erstellendes Verzeichnis schreiben, beim Programmstart.
    Geb aber gleich eine Versionsangabe mit in die Datei, damit Du sie gezielt bei Updates oder Recovery einer älterern Programmversion ggf. überschreibst.

    Z.B. File.WriteAllBytes(Pfad_dateiname.txt, MYProjectname.Properties.Resources.NameofTextfileInRessources);

    docs.microsoft.com/de-de/dotne…environment.specialfolder?
    docs.microsoft.com/de-de/dotne…stem.io.file.writealltext?
    docs.microsoft.com/de-de/dotne…tem.io.file.writeallbytes?
    docs.microsoft.com/de-de/dotnet/api/system.io.path.combine?