Form Einstellungen in Ini Speichern

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Form Einstellungen in Ini Speichern

    Hallo liebe Leute,

    Nehmen wir an ich habe 3x RadioButtons, 1x CheckBox, 2x TextBox. Nun schreibt der Benutzer in die beiden TextBoxen einen Text, wählt einen RadioButton und nutzt die CheckBox.

    Jetzt würde ich gerne das ganze über den SaveFileDialog in eine ini oder ähnliches Speichern um es später über OpenFileDialog wieder aufzurufen. Der Benutzer sollte den Speicherort natürlich frei wählen können.

    Wie das ganze mit einer TextBox in einer .txt (siehe spoiler) klappt habe ich bereits schon mal gemacht, nur leider weiß ich nicht wie es mit der Kombination aus RadioButtons, Checkbox und TextBox klappt.


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. SaveFileDialog1.ShowDialog()
    3. End Sub
    4. Private Sub SaveFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
    5. Dim Filetosaveas As String = SaveFileDialog1.FileName
    6. Dim objwriter As New System.IO.StreamWriter(Filetosaveas)
    7. objwriter.Write(TextBox1.Text)
    8. objwriter.Close()
    9. End Sub
    10. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    11. OpenFileDialog1.ShowDialog()
    12. End Sub
    13. Private Sub OpenFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
    14. With OpenFileDialog1
    15. TextBox1.Text = IO.File.ReadAllText(.FileName)
    16. End With
    17. End Sub



    Lg Crusted Core
    Naja, da du eh alles als Text in einer Datei speicherst, convertiere doch den CheckState der CheckBox in einen String. Bei den RadioButtons könntest du prüfen ob z.B. der erste ausgewählt ist und dann ne 1/2/3 in deine Datei schreiben.

    Dim String sGechecked As String = chkBox.CheckState.ToString()
    Dim sOptionen As String
    If (optXYZ.Checked) Then
    sOptionen = 1
    Else If(optABC.Checken) Then
    sOptionen = 2
    Else
    SOptionen = 3
    End If

    Wichtig hierbei ist, dass pro Datensatz eine Zeile der Datei verwendet wird. Dann kannst du das später zeilenweise wieder einlesen und du weißt bei welchem index welche Einstellung liegt.

    Alternativ kannst du das ganze mit ";" getrennt speichern und beim einlesen mit .Split wieder trennen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Vielen dank euch beiden für die Antwort.

    Bin noch etwas frischer dabei in vb.net.
    Würde mich freuen wenn ihr mir noch ein wenig mehr unter die Arme greift :whistling:

    hab das also bisher so gemacht
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub SaveFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
    2. Dim CheckBoxen As String = CheckBox1.CheckState.ToString()
    3. Dim RadioButtons As String
    4. Dim Filetosaveas As String = SaveFileDialog1.FileName
    5. Dim objwriter As New System.IO.StreamWriter(Filetosaveas)
    6. objwriter.Write(TextBox.Text)
    7. If (RadioButton1.Checked) Then
    8. RadioButtons = 1
    9. objwriter.Write(RadioButtons)
    10. ElseIf (RadioButton2.Checked) Then
    11. RadioButtons = 2
    12. objwriter.Write(RadioButtons)
    13. ElseIf (RadioButton3.Checked) Then
    14. RadioButtons = 3
    15. objwriter.Write(RadioButtons)
    16. End If
    17. If CheckBox1.Checked Then
    18. CheckBoxen = 1
    19. objwriter.Write(CheckBoxen)
    20. End If
    21. objwriter.Close()
    22. End Sub


    Wie bekomme ich nun jeweils das ganze immer in eine neue Spalte?
    Und wie schaut das ganze dann nachher mit dem auslesen aus?

    Lg Crusted Core

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Crusted Core“ ()

    Also ich würde das einfach mit den Settings abwickeln...
    Settings richtig verwenden + an Settings binden
    Und wenn du deine Daten noch dazu in eine extra Settings-Datei ablegen möchtest, siehe nochmals Post #3

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()

    Hey VB1963,
    habe es nun mit der Methode von @mrMo hinbekommen.
    Werde mir deine Variante aber auch nochmal genau angucken und mich daran versuchen damit ich auch das verstehe.

    Für alle anderen die mal ein ähnliches Problem haben und sich das Topic durchlesen, hier meine jetzige Lösung.

    Das ganze mit ein SaveFileDialog Speichern in eine txt oder wie auch immer:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub SaveFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
    2. Dim CheckBoxen As String = CheckBox1.CheckState.ToString()
    3. Dim RadioButtons As String
    4. Dim Filetosaveas As String = SaveFileDialog1.FileName
    5. Dim objwriter As New System.IO.StreamWriter(Filetosaveas)
    6. objwriter.Write(TextBox.Text)
    7. If (RadioButton1.Checked) Then
    8. RadioButtons = 1
    9. objwriter.Write(RadioButtons)
    10. ElseIf (RadioButton2.Checked) Then
    11. RadioButtons = 2
    12. objwriter.Write(RadioButtons)
    13. ElseIf (RadioButton3.Checked) Then
    14. RadioButtons = 3
    15. objwriter.Write(RadioButtons)
    16. End If
    17. If CheckBox1.Checked = True Then
    18. CheckBoxen = 1
    19. objwriter.Write(CheckBoxen)
    20. ElseIf CheckBox1.checked = False Then
    21. CheckBoxen = 2
    22. objwriter.Write(CheckBoxen)
    23. End If
    24. objwriter.Close()
    25. End Sub


    Und um es zu einem späteren Zeitpunkt wiederherzustellen mit einem OpenFileDialog:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub OpenFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
    2. Dim lines() As String = System.IO.File.ReadAllLines(OpenFileDialog1.FileName)
    3. TextBox.Text = lines(0).ToString
    4. If lines(1) = 1 Then
    5. RadioButton1.Checked = True
    6. ElseIf lines(1) = 2 Then
    7. RadioButton2.Checked = True
    8. ElseIf lines(1) = 3 Then
    9. RadioButton3.Checked = True
    10. End If
    11. If lines(2) = 1 Then
    12. CheckBox1.Checked = True
    13. ElseIf lines(2) = 2 Then
    14. CheckBox1.Checked = False
    15. End If
    16. End Sub


    Lg Crusted Core
    @Crusted Core Du bekommst permanent Schwierigkeiten, wenn Du Einstellungen hinzufügst.
    Lass den Quatsch von @mrMo und arbeite mit den Settings von @VB1963 .
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hallo nochmal :)

    hab mir das von @VB1963 nun mal angeschaut und ein neues Übungsprojekt gestartet.
    Enthalten in der Form sind: 2x Textboxen, 3x Radiobuttons,1x Checkbox und 2x Buttons.

    Habe alle Items eine Setting gegeben, außer die beiden Buttons.
    Die beiden Buttons sind nur zum Speichern/Laden da. Klappt alles wunderbar :)

    Speichern:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. My.Settings.textb1 = TextBox1.Text
    2. My.Settings.textb2 = TextBox2.Text
    3. My.Settings.radiob1 = RadioButton1.Checked
    4. My.Settings.radiob2 = RadioButton2.Checked
    5. My.Settings.radiob3 = RadioButton3.Checked
    6. My.Settings.checkb = CheckBox1.Checked


    Laden:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. TextBox1.Text = My.Settings.textb1
    2. TextBox2.Text = My.Settings.textb2
    3. RadioButton1.Checked = My.Settings.radiob1
    4. RadioButton2.Checked = My.Settings.radiob2
    5. RadioButton3.Checked = My.Settings.radiob3
    6. CheckBox1.Checked = My.Settings.checkb


    Das einzigste was ich nun nicht verstehe ist das Exportieren in eine externe Datei über savefiledialog und Laden mit openfiledialog.
    Der Quellcode in deinem Guide/Post (UserSettingsProvider (Persistieren von UserSettings)) ist mir nen bisl too much. Brauche ich den gesamten Code fürs speichern???

    Entschuldigt die vielen fragen, bin wie gesagt noch ziemlich frisch dabei :whistling:

    LG Crusted Core
    Wenn du deine Controls richtig an die Settings bindest, brauchst du keinen Code mehr zum Zuweisen der Daten... (siehe oben das verwiesene Tutorial von EDR)

    Crusted Core schrieb:

    Brauche ich den gesamten Code fürs speichern???
    Ja die Providerklasse musst du in dein Projekt einfügen und den Provider explizit angeben...
    Siehe dazu mehr UserSettingsProvider (Persistieren von UserSettings) und binär serialisiertes Setting mit einem Default-Wert

    VB1963 schrieb:

    Wenn du deine Controls richtig an die Settings bindest, brauchst du keinen Code mehr zum Zuweisen der Daten... (siehe oben das verwiesene Tutorial von EDR)
    Zitat von Crusted Core: „Brauche ich den gesamten Code fürs speichern???“Ja die…


    Hallo,

    Hab das nun an meinem Testprojekt mit 2x Textboxen, 3x Radiobuttons,1x Checkbox und 2x Buttons probiert, nur leider weiß ich nicht wohin mit deinem Code, das ist zu viel für ein Anfänger wie mir.
    Vielleicht kannst du mir das alles ein wenig genauer erklären. ?(

    lg

    Crusted Core schrieb:

    VB1963 schrieb:

    nur leider weiß ich nicht wohin mit deinem Code, das ist zu viel für ein Anfänger wie mir.


    Es hatte schon einen Grund warum ich neulich hier eine Anfängertaugliche Lösung aufgezeigt habe, die ja leider als "Quatsch" abgetan wurde.

    @CrustedCore, fang lieber mit einfachen Dingen (meine Lösung oder die Settings ohne den Speicherort zu wählen) an und arbeite dich dann step by step in die einzelnen Themen ein. Alles auf einmal lernen zu wollen ist nicht ratsam ;)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Crusted Core schrieb:

    Vielleicht kannst du mir das alles ein wenig genauer erklären.
    Ganz einfach:
    Füge Deinem Projekt die Klassen (Namen aus dem Link von @VB1963 ) in separaten Dateien als vorhandene Datei hinzu:
    • DirectorySettingsProvider => DirectorySettingsProvider.vb
    • DirectorySettings => DirectorySettings.vb
    ändere den Namespace entsprechend Deines Projektes.
    Füge die System.Configuration.dll Deinem Projekt als Verweis hinzu.
    Feddig.
    ======
    Im Designer des Controls klickst Du auf ApplicationSettings und (PropertyBinding), wählst Text bzw. Checked als zu bindende Property aus und gibst den Namen Deines Settings vor.
    Nach Starten und Beenden des Programms liegt die Datei NAME_DEINES_PROGRAMMS.config.dat (oder so ähnlich) neben Deinem Programm und enthält die aktuellen Einstellungen.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    Crusted Core schrieb:

    Vielleicht kannst du mir das alles ein wenig genauer erklären.
    Ich habe dir eine kleine Testsolution angehängt. Da werden deine oben vorgeschlagenen Controls an die Settings gebunden und die Settings-Daten über einen DirectorySettingsProvider bedient. Damit hast du den Vorteil, dass du selber über den Speicherort der Settings entscheiden kannst. Mit der Propertybindung hast du den Vorteil, dass du nicht selbst die Daten zu den Property-Settings in beiden Richtungen zuweisen musst, sondern das erledigt die Bindung selber!
    Den Aufbau des Projektes kannst du im Bildchen anschauen - da wurde der DirectorySettingsProvider dem Projekt hinzugefügt...

    Wichtig ist, dass du einen Verweis auf den DirectorySettingsProvider erstellst (siehe den aktuell angewählter Verweis im Bildchen)

    Als nächsten Schritt schaust du dann in den Settings-Editor (Projekt/Projekteigenschaften/Einstellungen...)

    Da legst du deine Properties mit Voreinstellungen an, die du haben möchtest...
    Wie man oben im Bildchen zu sehen ist, kann man über den Button <> Code anzeigen in die Settings.vb-Datei gehen. Das ist eine Partial-Klasse der Settings-Klasse, die du mit dem Editor erstellt hast...
    Dort musst du den DirectorySettingsProvider manuell angeben (schaue Listing Zeile #9)

    VB.NET-Quellcode

    1. Namespace My
    2. 'Diese Klasse ermöglicht die Behandlung bestimmter Ereignisse der Einstellungsklasse:
    3. ' Das SettingChanging-Ereignis wird ausgelöst, bevor der Wert einer Einstellung geändert wird.
    4. ' Das PropertyChanged-Ereignis wird ausgelöst, nachdem der Wert einer Einstellung geändert wurde.
    5. ' Das SettingsLoaded-Ereignis wird ausgelöst, nachdem die Einstellungswerte geladen wurden.
    6. ' Das SettingsSaving-Ereignis wird ausgelöst, bevor die Einstellungswerte gespeichert werden.
    7. <Global.System.Configuration.SettingsProviderAttribute(GetType(DirectorySettingsProvider.MyProvider.DirectorySettingsProvider))> _
    8. Partial Friend NotInheritable Class MySettings
    9. End Class
    10. End Namespace
    Man kann auch nur einzelne Eigenschaften der Controls über den Provider bedienen...
    Dazu braucht man dann nicht den Provider in der Zeile #9 bekannt geben, sondern man gibt den Provider der ausgewählten Eigenschaft in den Settingseigenschaften im Feld Provider im vollqualifizierten Namen an!
    Die übrigen Settingseigenschaft werden dann schlussendlich, wieder wie üblich mit dem Standardprovider bedient!


    Den Speicherort der Settingsdaten, die der Provider verwaltet, kannst du dann noch explizit bestimmen (wenn der Ort nicht angegeben wurde, speichert der Provider alles in den Anwendungspfad...)

    VB.NET-Quellcode

    1. Imports DirectorySettingsProvider.MyProvider
    2. Public Class Test
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. '
    5. 'Beispiel für einen beliebigen Speicherort der Settingsdatei:
    6. '
    7. Dim mySettings As New DirectorySettings
    8. mySettings.DirectoryName = "C:\"
    9. mySettings.FileName = "DirectorySettingsTest.dat"
    10. mySettings.Save() ' hier muss die Einstellung der Settings explizit gepeichert werden!!!
    11. End Sub
    12. End Class

    Wie du die Controleigenschaften an die Settings bindest, kannst du unten im Bild bei den Eigenschaften bewerkstelligen (im nächsten Bild ist ein Beispiel mit der TextBox.Text-Eigenschaft...)
    Genaueres dazu kannst du im Tutorial von @ErfinderDesRades nachlesen Settings richtig binden


    Ja, das war es dann auch schon - jetzt müsste all das funktionieren...
    Ich hoffe, dir da ein wenig verständlich geholfen zu haben und dass du dazulernen konntest... ;)

    Wie ich sehe, hat dir Rod gerade den Weg dazu schon beschrieben...
    Dateien

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „VB1963“ ()

    mrMo schrieb:

    Zitat von Crusted Core: „Zitat von VB1963: „nur leider weiß ich nicht wohin mit deinem Code, das ist zu viel für ein Anfänger wie mir. “

    Es hatte schon einen Grund warum ich neulich hier eine Anfängertaugliche Lösung aufgezeigt habe, die ja…


    Die Lösung war auch sehr Hilfreich und hatte für den Anfang auch gereicht für mich. Danke dafür auch nochmal :)

    @VB1963, @RodFromGermany
    euch beiden nun auch ein fettes danke :) Nun hab ich´s auch verstanden. Wenn ich irgendwann mal weiter drin bin in der Materie werde ich mir das ganze Projekt nochmal genau angucken damit ich jeden Vorgang genau verstehe.


    Eine frage hätte ich da nun doch noch :D Ist es mit deinem Projekt möglich bei jedem Start der Form die Ursprungs Form zu laden und zu einem späteren Zeitpunkt die gespeicherte .dat zu laden?