My.Settings form-übergreifend speichern

  • VB.NET
  • .NET 4.5

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von JackCimberly.

    My.Settings form-übergreifend speichern

    Hi Gemeinde.

    Ausgangspunkt (Bild):


    Sämtliche Einstellungen habe ich über TreeView umgesetzt. Klappt tadellos.


    Habe drei Forms:
    frmSettings (TreeView & Panel)
    -> frmSettGeneral (ufrm)
    -> frmfrmSettOnlineUpdate (ufrm)

    Buttons OK und Abbrechen.

    In allen drei Forms werden Daten in My.Settings gespeichert. Gleich bei Änderungen werden diese gespeichert.
    Genau das möchte ich nicht - nur wenn man auf OK klickt oder die Form schließt, soll die Speicherung stattfinden.

    Mit

    VB.NET-Quellcode

    1. frmSettGeneral.My.Settings.Save()
    klappt nicht ^^

    Wie könne man das umsetzen?
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren
    Das verstehe ich jetzt nur bedingt.

    Auf der Form frmSettings liegen die beiden Buttons OK und Abbrechen.
    Der Button OK soll die Eigenschaft DialogResult = OK haben?

    In den ufrm´s jeweils eine Klasse (mit Variablen), die ich im ​Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click hinterlege?
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren
    @JackCimberly My.Settings sind statisch, es gibt nur eine einzige Settings-Instanz, da reicht My.Settings.Save().
    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!
    ich verstehe 3 Dinge nicht:
    • Komischer Aufbau - wieso braucht man 3 Forms, um Programm-Optionen festzulegen? Normalerweise hat man für solch doch genau 1 Dialog und gut ist.
    • Was ist ein ufrm - und warum steht es immer in Klammern?
    • Was bedeutet der Satz in post#3, wo du "in den ufrms in Click-Event-Codes eine Klasse mit Variablen hinterlegen" willst - da passen Begrifflichkeiten nicht zusammen - ungefähr wie "auf der Autobahn mit dem Reinheitsgebot einen Fisch definieren".
    Ansonsten kann My.Settings.Save nicht das Problem sein, sondern eher, die Settings ühaupt richtig zu setzen, bevor sie (alle in eim Rutsch - eben mit My.Settings.Save) gespeichert werden.

    RodFromGermany schrieb:

    @JackCimberly My.Settings sind statisch, es gibt nur eine einzige Settings-Instanz, da reicht My.Settings.Save().


    Tatsächlich. 1x My.Settings.Save() irgendwo langt (in meinen Fall Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click).
    Klappt tadellos.

    Danke Dir.

    ======
    EDIT
    ======

    ErfinderDesRades schrieb:

    Komischer Aufbau - wieso braucht man 3 Forms, um Programm-Optionen festzulegen? Normalerweise hat man für solch doch genau 1 Dialog und gut ist.
    Eine einfache Form hat für mich nicht gelangt ... zumindest keine andere Lösung gefunden, dieses so umzusetzen, wie ich es gerade habe (siehe Bild von Post #1).

    ErfinderDesRades schrieb:

    Was ist ein ufrm - und warum steht es immer in Klammern?
    ufrm - Unterform: Untergeordnet der Form frmSettings. Für mich für die Übersichtlichkeit.

    ErfinderDesRades schrieb:

    Was bedeutet der Satz in post#3, wo du "in den ufrms in Click-Event-Codes eine Klasse mit Variablen hinterlegen" willst - da passen Begrifflichkeiten nicht zusammen - ungefähr wie "auf der Autobahn mit dem Reinheitsgebot einen Fisch definieren".
    Ja ok, das war blöd beschrieben. Aber Dein Beispiel gefällt mir aber besser.Mit My.Settings.Save() hat nun geklappt.Danke auch @ErfinderDesRades
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren

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

    ist aber ;)

    Mit (Ausschnitt):

    VB.NET-Quellcode

    1. ​Dim node As TreeNode = TreeView1.SelectedNode
    2. Select Case (node.Text)
    3. Case "General"
    4. frm.Dispose()
    5. frm = New frmSettGeneral
    6. frm.TopLevel = False
    7. MainPanel.Controls.Add(frm)
    8. frm.Dock = DockStyle.Fill
    9. frm.Show()
    10. Case "Online-Updates"
    11. frm.Dispose()
    12. frm = New frmSettOnlineUpdate
    13. frm.TopLevel = False
    14. MainPanel.Controls.Add(frm)
    15. frm.Dock = DockStyle.Fill
    16. frm.Show()
    17. Case Else
    18. 'hier soll nichts passieren
    19. End Select
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren
    @JackCimberly Räum mal den Code ein wenig auf:

    VB.NET-Quellcode

    1. Dim node As TreeNode = TreeView1.SelectedNode
    2. frm.Dispose()
    3. Select Case (node.Text)
    4. Case "General"
    5. frm = New frmSettGeneral
    6. Case "Online-Updates"
    7. frm = New frmSettOnlineUpdate
    8. Case Else
    9. 'hier soll nichts passieren
    10. Return
    11. End Select
    12. frm.TopLevel = False
    13. MainPanel.Controls.Add(frm)
    14. frm.Dock = DockStyle.Fill
    15. frm.Show()
    Übrigens gibt es eine Projekteinstellung, die per Default die Settings beim Schließen des Programms speichert.
    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!
    @RodFromGermany

    ;) Aufgeräumt und verstanden.

    ​My.Settings beim Herunterfahren speichern ist aktiv.
    Ganze Mühe war umsonst ;).

    Wobei das Wort "herunterfahren" aus meiner Sicht nicht gerade sehr treffend ist. ;)

    Danke Dir.
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren

    JackCimberly schrieb:

    "herunterfahren"
    Das ist wohl eher das Relikt einer nicht sorfgfältigen Übersetzung (=> "Lost in Translation" ;) ).
    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!
    ;)

    Wobei ich das ​My.Settings beim Herunterfahren speichern deaktivieren werde (sind ja bisher 2 Benutzer-Settings, die zu machen sind. Die anderen sind anwendungsspezifisch.).
    Sonst macht das mit dem OK- und Abbrechen-Button kein Sinn.

    Somit ist dem Anwender auch die Option gegeben, durch einfaches schließen der Einstellungen, nichts zu speichern.
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren

    JackCimberly schrieb:

    MainPanel.Controls.Add(frm)
    Dafür sind Forms eiglich nicht vorgesehen.
    Usercontrols sind dafür vorgesehen - sollteste dir mal angucken - projekt - Hinzufügen - UserControl (oder "BenutzerSteuerelement").
    Man kann sogar ein Form in ein UserControl umwandeln - einfach im DesignerCode die Anweisung Inherits System.Windows.Form ersetzen durch Inherits System.Windows.UserControl - und dann die entstehenden Fehler-Zeilen löschen, weil dassis Code, der dann nicht gebraucht wird.
    Aber immer schön Backup machen!
    Kurzum:

    @ErfinderDesRades
    Habe ich das richtig verstanden, dass ich die ufrm´s durch UserControls ersetzen soll?
    Umwandeln eher nicht, erstelle diese neu. ;) Habe ja ein Vorlage.
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren
    Das wäre der Weg, wenn Du ihn wie bisher gehen willst, nur eben etwas sauber. Aber warum nicht ein zusätzliches Fenster à la ShowDialog aufploppen lassen (s. Post#5)? Wäre m.E. sauberer getrennt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    JackCimberly schrieb:

    Umwandeln eher nicht
    Geht aber ganz easy, Du öfnest die FormX.Designer.vb und ersetzt Inherits Form durch Inherits UserControl.
    Da musst Du noch zwei oder drei Zeilen in der FormX.Designer.vb löschen, die verrät Dir aber der Compiler,
    Feddich.
    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!

    ErfinderDesRades schrieb:

    Aber immer schön Backup machen!



    *hüstel* Verdammt ^^ Inherits geändert ... schwupp ... haufenweise Fehler. Glaube nicht, dass ich das alles löschen kann ^^

    VaporiZed schrieb:

    Das wäre der Weg, wenn Du ihn wie bisher gehen willst, nur eben etwas sauber. Aber warum nicht ein zusätzliches Fenster à la ShowDialog aufploppen lassen (s. Post#5)? Wäre m.E. sauberer getrennt.

    Sauberer auf jeden Fall. Aber ich hasse Anwendungen, wo eine Interaktion des Benutzers erforderlich ist, 1000 Fenster sich öffnen (also PopUps, etc.). Mag das alles zentral geregelt haben.

    RodFromGermany schrieb:

    Geht aber ganz easy, Du öfnest die FormX.Designer.vb und ersetzt Inherits Form durch Inherits UserControl.
    Da musst Du noch zwei oder drei Zeilen in der FormX.Designer.vb löschen, die verrät Dir aber der Compiler,
    Feddich.

    Siehe oben.

    Egal .... lösche die eine ufrm und erstelle sie neu. Umwandeln blöd ^^


    ====
    Edit
    ====

    @ErfinderDesRades, @VaporiZed, @RodFromGermany

    So, alles manuell neu angelegt (UserControl).

    ​S"TopLevel" ist kein Member von "UserControl"
    Die entsprechende Zeile gelöscht ... zwei drei Anpassungen vorgenommen. Fertig.

    Läuft!
    Danke für Eure Anregungen.

    Also UserControls bei Benutzer-Interaktionen hernehmen?
    Grüße JackCimberly

    Deine Anfrage erledigt?
    Als erledigt markieren

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