WinForms Standard Speichern/Schließen Verhalten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Narretei.

    WinForms Standard Speichern/Schließen Verhalten

    Grüße,

    ​ich betreue eine Haussoftware und habe Standardfunktionen für das Speichern und Schließen einer Form. Es gibt die Knöpfe "Speichern&Schließen", "Speichern" und "Schließen". Hier im folgenden der Code den ich momentan in jede Form Copy&Paste, in der er benötigt wird:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub btnSpeichernUndSchliessen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSpeichernUndSchliessen.Click
    2. Speichern()
    3. Me.Close()
    4. End Sub
    5. Private Sub btnSpeichern_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSpeichern.Click
    6. Speichern()
    7. End Sub
    8. Private Sub btnSchliessen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSchliessen.Click
    9. Me.Close()
    10. End Sub
    11. Private Sub FormABC_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    12. If e.CloseReason = CloseReason.TaskManagerClosing OrElse e.CloseReason = CloseReason.WindowsShutDown OrElse e.CloseReason = CloseReason.None Then
    13. mDaten.RejectChanges()
    14. Else
    15. If Not SpeicherDialog() Then e.Cancel = True
    16. End If
    17. End Sub
    18. Private Function SpeicherDialog() As Boolean
    19. If mDaten.GetChanges Is Nothing Then Return True
    20. Select Case MessageBox.Show("Möchten Sie Ihre Änderungen speichern? Alle ungespeicherten Änderungen gehen verloren.", Me.Text, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)
    21. Case DialogResult.Yes
    22. Speichern()
    23. Return True
    24. Case DialogResult.No
    25. mDaten.RejectChanges()
    26. Return True
    27. Case DialogResult.Cancel
    28. Return False
    29. End Select
    30. Return False
    31. End Function
    32. Private Sub Speichern()
    33. If mDaten.GetChanges Is Nothing Then Exit Sub
    34. My.Dingens.UPDATE_ABC(mDaten.GetChanges)
    35. mDaten.AcceptChanges()
    36. End Sub[/spoiler][spoiler]



    ​Ich würde nun gerne eine Möglichkeit schaffen, insofern benötigt, der Form in irgendeiner Weise mitzuteilen, dieses Standardverhalten einzuhalten. Dazu muss ich der Form (hier FormABC) dann die drei relevanten Knöpfe mitteilen, das oder die zu speichernden Datasets (hier mDaten) und die (jedes mal anders heißende) Funktion (pro Dataset, hier My.Dingens.UPDATE_ABC()), welche das Aktualisieren auf der Datenbank übernimmt.

    ​Wie kann ich das anstellen?

    Narretei schrieb:

    den ich momentan in jede Form Copy&Paste, in der er benötigt wird
    Gib Deinen Formen eine gemeinsame von Form abgeleitete Basisklasse, wo solch reinkommt.
    Die Button und der Code.
    Falls Du in einer abgeleiteten Form die Button woanders hin haben willst, musst Du dies im Konstruktor oder Form_Load machen.
    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!
    Das Stichwort hat gereicht damit ich mit Google zum Ziel kam.
    Hier für die, die nach mir kommen:
    1. Erstellt euch eine normale Windows-Form mit allem drauf drin und dran was ihr haben möchtet. Ich erstelle beispielsweise eine Form namens BunteForm, welche auf Knopfdruck (der Knopf heißt Spaßknopf) den Hintergrund Pink färbt.
    2. Kompiliert die Kiste als .exe oder .dll

    Wollt ihr nun eure eine neue Form der Klasse BunteForm hinzufügen geht ihr wie folgt vor:
    3. Projekt -> Windows Form hinzufügen ODER Hinzufügen -> Neues Element.
    4. Klick auf Allgemein -> Windows Forms -> Geerbtes Formular -> der neuen Form noch nen Namen verpassen
    5. .exe oder .dll auswählen -> BunteForm auswählen

    Jede dadurch erstellte Form hat automatisch allen Code und alle Steuerelemente drin, die die Parentform auch hat.
    Anleitung gibt's auch nochmal hier: docs.microsoft.com/de-de/dotne…ritance-picker-dialog-box
    Danke @RodFromGermany !