Announcement

Collapse
No announcement yet.

app.config per Form ändern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • app.config per Form ändern

    Hallo mal wieder,

    nachdem mir in meinen Anfängen (welche erst 4 Tage zurück liegen) so gut hier geholfen wurde (Danke an der Stelle nochmal), hab ich heute ein weiteres anliegen.
    In meinem kleinen Programm sollen die Benutzer die Möglichkeit haben, Felder und deren Funktionen mittels eines Einstellungs-Fensters selbst zu bestimmen. Zu diesem Zwecke möchte ich (weils für mich logisch ist) die app.config nutzen. Wie ich diese innerhalb des VS einstelle, ist mir klar, wie ich diese Werte auch wieder Abrufe ist mir auch klar, nur nicht, wie ich sie dort aus einem Form reinspeicher!
    Klar was ich meine? Möchte also, das der Benutzer alles nach seinem belieben einstellen kann (ohne in der XML rum zu schreiben) und beim nächsten Öffnen alles auch dann so ist!
    Bitte um Hilfe, im SDK hab ich nichts darüber gefunden, vielleicht aber auch nur falsch gesucht...!?

    Ciao Chris

  • #2
    Du kannst ein PropertyGrid-Steuerelement verwenden:

    Code:
    propertyGrid1.SelectedObject = Properties.Settings.Default;
    [...] // Einstellungen ändern
    Properties.Settings.Default.Save();

    Comment


    • #3
      Oh, das ging flott!
      Jetzt muss ich dich leider nur enttäuschen, Hilfe!!
      Wie schon erwähnt, reichen meine Erfahrungen in C# ganze 4 Tage zurück, folglich bin ich gerade ein wenig überfordert. Vielleicht kannste mir ein Beispiel liefern, weil ich auch aus den Beschreibungen über diese Klasse nicht schlauer werde. Ich würde mir vorstellen, dass die Daten aus der app.config erst ausgelesen werden und dann in nem Textfeld angezeigt werden. Der Benutzer soll dann die Möglichkeit haben, dieses zu ändern und zu speichern. Wenn ich im VS ein PropertyGrid hinzu füge sieht das aber mal gar nicht so aus, wie ich mir das vorstelle! Ich finde auch keine Möglichkeit, da ein Textfeld rein zu bekommen. Wie ich ein Textfeld an die Daten anbinde ist mir schon klar, heißt auslesen schaff ich schon, aber wenn man ja jetzt das Feld ändert, dann ändert sich das ja in der config nicht... oder!?
      Boa, ich bin grad echt überfordert....!!

      Comment


      • #4
        Ein kleines Beispiel:


        Code:
        using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.Data;
        using System.Drawing;
        using System.Linq;
        using System.Text;
        using System.Windows.Forms;
        
        namespace SettingsEditor
        {
            public partial class Form1 : Form
            {
                public Form1()
                {
                    InitializeComponent();
                }
        
                private void Form1_Load(object sender, EventArgs e)
                {
                    textBoxName.DataBindings.Add("Text", Properties.Settings.Default, "Name");
                    textBoxVorname.DataBindings.Add("Text", Properties.Settings.Default, "Vorname");
                }
        
                private void buttonSave_Click(object sender, EventArgs e)
                {
                    Properties.Settings.Default.Save();
                }
            }
        }

        Comment


        • #5
          Super, das hat mich um einiges weiter gebracht... DANKE!!!

          Aber ein Problem hab ich noch:
          Das abzufragende Feld bekomm ich in die Textbox, das funzt wunderbar. Ich kann es auch speichern, nur ändert sich in der app.config gar nichts!! Wenn ich die anwendung schließe und neu öffne ist der geänderte Eintrag aber drinnen. Wenn ich aber von einer anderen Form auf diesen Eintrag zugreifen will, ist noch der alte drinnen. Wie das? Was mach ich falsch??

          private void Form4_Load(object sender, EventArgs e)
          {
          textBox1.DataBindings.Add("Text", Properties.Settings.Default, "video1");
          }

          private void buttonSave_Click(object sender, EventArgs e)
          {
          Properties.Settings.Default.Save();

          }
          Achso, noch was ganz wichtiges: Ich möchte unter anderem Dateipfade abspeichern und wieder hergeben, aber das geht scheinbar auch nicht, weil der "\" falsch interpretiert wird. Wenn ich aber aus einem OpenFileDialog ne Datei aussuche, bekomm ich ja nichts anderes...! Welchen Typ muss ich verwenden um Dateipfade zu nutzen?

          Comment


          • #6
            Hallo,

            die app.config ist in der Regel nur zum Lesen gedacht. Daten, die zu ändern sind, gehören normalerweise zu den User-bezogenen Daten und stehen im Bereich "Dokumente und Einstellungen".

            Viele Informationen dazu findest Du in der SDK-Doku, ausgehend von der ConfigurationManager-Klasse.

            Jürgen

            Comment


            • #7
              OK, langsam werd ich schlauer!
              Ich hab jetzt eine eigene Setting Datei angelegt (user.config), welche automatisch nach C:\Users\Chris\AppData\Local\Cobus\Cobus.vshost.ex e_Url_1jexbgzgcmjuahd1qae3pdeyrujnizre gespeichert werden. Nur legt er fast jedes mal einen neuen Ordner an. Wann das passiert weiß ich nicht! Wie kann ich das umgehen? Die Daten, die ich will speichert er auch brav da rein und ich kann sie auch wieder auslesen...!
              Meine wichtigste Frage ist aber immernoch, wie ich einen Dateipfad darin speichern kann, denn als String klappt das nicht! Wie dann???

              Comment


              • #8
                Originally posted by Hurtz2k View Post
                Das abzufragende Feld bekomm ich in die Textbox, das funzt wunderbar. Ich kann es auch speichern, nur ändert sich in der app.config gar nichts!! Wenn ich die anwendung schließe und neu öffne ist der geänderte Eintrag aber drinnen. Wenn ich aber von einer anderen Form auf diesen Eintrag zugreifen will, ist noch der alte drinnen. Wie das? Was mach ich falsch??
                Wenn Du die Anwendungseinstellungen über den Einstellungs-Designer gemacht hast, wird dir wohl aufgefallen sein, dass es dort eine Spalte mit der Überschrift "Bereich" gibt. Du kannst dort den Gültigkeitsbereich einer Einstellung als "Anwendung" oder "Benutzer" deklarieren. Im ersten Fall wirst Du keine Änderungen zur Laufzeit vornehmen können und die Einstellung gilt für alle Benutzer, im zweiten Fall ist eine Änderung durch einzelne Benutzer zur Laufzeit möglich. Der Speicherort der Einstellungsdatei variiert je nach Einstellungs-Bereich. Anwendungseinstellungen verbleiben in der Datei [Anwendungsname].config, die sich im selben Ordner wie die ausführbare Datei befindet, während Benutzereinstellungen standardmäßig im Ordner C:\Dokumente und Einstellungen\[Benutzername]\Lokale Einstellungen\Anwendungsdaten\[Firmenname]\[Anwendungsversionsordner]\[Version] als user.config gespeichert werden. Wenn Du also in der o.g. Anwendung auf Speichern klickst, werden nur die geänderten Benutzereinstellungswerte in der user.config gespeichert. Die [Anwendungsname].config bleibt davon unberührt. Der Hintergrund ist recht simpel: Du wirst nicht wollen, dass ein falscher Benutzereintrag deine Anwendung unbrauchbar für ALLE Benutzer macht. Wenn "Roaming" aktiviert ist, werden die Benutzereinstellungen nicht lokal sondern auf dem Server gespeichert (falls servergespeicherte Profile verwendet werden). Wenn der Visual Studio Host-Prozess in den Debug-Einstellungen aktiviert wurde, wird statt [Anwendungsname].config [Anwendungsname].vshost.exe.config verwendet. Ich setze hier einen Punkt in der Übersicht, man könnte noch lange darüber reden.

                Achso, noch was ganz wichtiges: Ich möchte unter anderem Dateipfade abspeichern und wieder hergeben, aber das geht scheinbar auch nicht, weil der "\" falsch interpretiert wird. Wenn ich aber aus einem OpenFileDialog ne Datei aussuche, bekomm ich ja nichts anderes...! Welchen Typ muss ich verwenden um Dateipfade zu nutzen?
                Sorry, ich verstehe nicht, was Du meinst. Wenn Du im obigen Beispiel unter der Einstellung "Name" z.B. "C:\Windows" eingibst, wird dieser Wert ohne weitere Komplikationen nach der Datenbindung in der Textbox angezeigt.

                Eine kleine Warnung am Ende. Die Einstellungen werden oft als "poor man's database" missbraucht. Dazu sind sie nicht da. Es sind ihnen enge Grenzen gesetzt.

                Und: Man kann sich zwar vieles im "learning by doing"-Verfahren erarbeiten, aber nichts kann ein gutes Buch und die Dokumentation ersetzen.

                Comment


                • #9
                  Originally posted by Hurtz2k View Post
                  Nur legt er fast jedes mal einen neuen Ordner an. Wann das passiert weiß ich nicht!
                  Bei jeder Änderung deiner Anwendung und/oder der Versionsnummer.

                  Wie kann ich das umgehen?
                  Gar nicht. Warum solltest Du diesen perfekt laufenden Automaten ändern wollen?

                  Meine wichtigste Frage ist aber immernoch, wie ich einen Dateipfad darin speichern kann, denn als String klappt das nicht! Wie dann???
                  ???

                  Comment


                  • #10
                    Originally posted by maro158 View Post
                    Sorry, ich verstehe nicht, was Du meinst. Wenn Du im obigen Beispiel unter der Einstellung "Name" z.B. "C:\Windows" eingibst, wird dieser Wert ohne weitere Komplikationen nach der Datenbindung in der Textbox angezeigt.

                    Eine kleine Warnung am Ende. Die Einstellungen werden oft als "poor man's database" missbraucht. Dazu sind sie nicht da. Es sind ihnen enge Grenzen gesetzt.

                    Und: Man kann sich zwar vieles im "learning by doing"-Verfahren erarbeiten, aber nichts kann ein gutes Buch und die Dokumentation ersetzen.
                    Hi Maro,

                    das mit den Bereichen hab ich schon gelesen und auch so umgesetzt, bisher hab ich mich immer gewundert, dass jedes Mal, sobald ich ein bisschen was geändert habe, die Datei neu angelegt wird, jetzt ist mir das aber alles klar, weil dadurch ja quasi ne neue Version entsteht. Solange ich im Debug also nichts änder bleibt mir die user.setting erhalten. In der späteren Releas ist das dann nicht mehr so, oder!?

                    Was die Sache mit der Database angeht, dienen diese Einstellungen wirklich als Einstellungen. Es sollen Felder definiert werden, welche der Benutzer anpassen können soll.

                    Du hast recht, Learning by doing ist nicht alles, aber so hab ich mir bisher fast alles bei gebracht. Ich brauch immer nen Code oder so um wirklich die zusammenhänge zu kappieren. Literatur oder die SDK sind unumgänglich und haben mir bei anderen Sachen schon weiter geholfen, aber ich hab nicht gewusst unter was ich suchen müsste. Aber jetzt ist mir alles klar und ich kann so weiter machen wie ich will... DANKE DANKE DANKE!!!

                    Achso, eine Verlegenheitsfrage hab ich da jetzt doch noch.....: Wäre es theoretisch möglich, die User.Config über einen Button als Datei in einem Verzeichnis seiner Wahl zu speichern, bzw aus einen Verzeichnis heraus zu laden? Ziel wäre, die Einstellungen zu Speichern um sie A) weitergeben zu können und B) um mehrere Profile anlegen und laden zu können...! Mir wär die Idee gekommen, die user.config einfach beim laden eine anderen zu ersetzten, aber woher weiß das Prog wo die sich jetzt genau befindet? Kann ich ihm das irgendwie sagen, oder wäre es sinnvoll, die Werte der Datei in ein Formular zu laden und dieses dann speichern zu lassen!? Verstehste was ich meine? Glaub umständlich ausgedrückt...!

                    Comment


                    • #11
                      Achso, jetzt wo ich das ganze kappiere hat sich das mit dem Pfad erledigt!

                      Comment


                      • #12
                        OK, hab jetzt endlich mal alles kappiert, hab fleißig gearbeitet und steh jetzt für dem nächsten Problem, auf das ich im gesamtem Google-Netz keine Antwort finde (geschweige denn in SDK).

                        Ich habe 24 Felder definiert. Alle Felder haben einen eigenen Namen und verweisen auf ein Feld in meiner Settings-Datei. Die Felder in der Setting sind alle für Benutzereingaben ausgelegt. Die schreibweise mehrfach überprüft und somit korrekt. Die Felder sollen alle Dateinamen enthalten, dementsprechend hängt an jedem Feld ein eigener openFileDialog. Das klappt auch alles so weit. Ich kann die Felder füllen und mein Standartwert aud der Config wird gelesen. Wenn ich jetzt die Felder mit Hilfe der openFileDialoge fülle, wird nur 1 Feld gespeicher! Wenn ich sie von Hand fülle, aber alle ausgefüllten....! Wieso dass denn??? Hilfe!!!

                        Comment


                        • #13
                          Hallo,

                          versuch's mal mit folgendem Code:

                          Code:
                          using System;
                          using System.Collections.Generic;
                          using System.ComponentModel;
                          using System.Data;
                          using System.Drawing;
                          using System.Linq;
                          using System.Text;
                          using System.Windows.Forms;
                          
                          namespace SettingsEditor
                          {
                              public partial class Form1 : Form
                              {
                                  BindingSource bindingSource = new BindingSource();
                          
                                  public Form1()
                                  {
                                      InitializeComponent();
                                  }
                          
                                  private void Form1_Load(object sender, EventArgs e)
                                  {
                                      bindingSource.DataSource = Properties.Settings.Default;
                                      textBoxFile1.DataBindings.Add("Text", bindingSource, "File1");
                                      textBoxFile2.DataBindings.Add("Text", bindingSource, "File2");
                                  }
                          
                                  private void buttonSave_Click(object sender, EventArgs e)
                                  {
                                      bindingSource.EndEdit();  // <-- die entscheidende Stelle
                                      Properties.Settings.Default.Save();
                                  }
                          
                                  private void GetFile(object sender, EventArgs e)
                                  {
                                      OpenFileDialog ofd = new OpenFileDialog();
                                      if (ofd.ShowDialog() == DialogResult.OK)
                                      {
                                          switch ((string)(sender as Button).Name)
                                          { 
                                              case "button1":
                                                  textBoxFile1.Text = ofd.FileName;
                                                  break;
                                              case "button2":
                                                  textBoxFile2.Text = ofd.FileName;
                                                  break;
                                          }
                                      }
                                  }
                              }
                          }
                          Literatur: http://msdn2.microsoft.com/de-de/lib...ingsource.aspx
                          Zuletzt editiert von maro158; 08.04.2008, 07:51.

                          Comment


                          • #14
                            Mhhh, das löst das Problem auch nicht ganz. Interessant ist, dass wenn ich die Felder mit dem OFD fülle, wird nichts gespeichert, fülle ich sie aber mit der Hand, werden sie gespeichert....!? Wie kann dass denn sein?

                            Comment


                            • #15
                              Originally posted by Hurtz2k View Post
                              Mhhh, das löst das Problem auch nicht ganz. Interessant ist, dass wenn ich die Felder mit dem OFD fülle, wird nichts gespeichert, fülle ich sie aber mit der Hand, werden sie gespeichert....!? Wie kann dass denn sein?
                              Dann machst Du eben was falsch. Der Code von vorhin funktioniert 100%. Brauchst Du ein Beispiel-Projekt (VS2008)?

                              Comment

                              Working...
                              X