SaveFileDialog Dataset

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

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    SaveFileDialog Dataset

    Hi,

    ich arbeite mit einem Dataset um eine .xml datei zu speichern oder zu laden.
    Jetzt möchte ich zum Laden einen OpenfileDialog u. zum Speichern ein SaveFileDialog benutzen

    So habe ich es vorher gemacht.

    VB.NET-Quellcode

    1. 'Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
    2. ' Private _DataPath As String = Application.StartupPath
    3. ' Private _DataFile As New FileInfo(_DataPath & "\Bewerbung.xml")


    Zum Laden mache ich es jetzt so

    VB.NET-Quellcode

    1. Private Sub OpenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OpenToolStripMenuItem.Click
    2. OpenFileDialog1.Title = "Wähle"
    3. OpenFileDialog1.Filter = "XML Datei|*.xml"
    4. If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
    5. LoadDataSet(Xmldataset)
    6. End If


    Probleme gibt es beim Speichern da komme ich nicht klar

    VB.NET-Quellcode

    1. Public Sub LoadDataSet(ByVal myDS As DataSet)
    2. 'myDS.Clear()
    3. 'If _DataFile.Exists Then
    4. 'myDS.ReadXml(_DataFile.FullName)
    5. 'End If
    6. End Sub
    7. 'Public Sub SaveDataSet(ByVal myDS As DataSet)
    8. 'myDS.WriteXml(_DataFile.FullName)
    9. ' myDS.AcceptChanges()
    10. ' End Sub
    11. Private Sub SpeichernToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SpeichernToolStripMenuItem.Click
    12. Validate()
    13. BewerbungBindingSource.EndEdit()
    14. 'SaveDataSet(Xmldataset)
    15. 'Refresh()
    16. SaveFileDialog1.Filter = "XML Datei (*.xml*)|*.xml"
    17. If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK _
    18. Then
    19. SaveDataSet(Xmldataset)
    20. Refresh()
    21. End If
    22. End Sub


    Meldung SaveDataSet wurde nicht deklariert

    Versuche es schon den ganzen Tag komme aber nicht hinter das Problem
    habe ich auch schon gemacht.

    Dann bekomme ich das siehe Screenshot

    Bin jetzt vollkommen durcheinander :(

    Nachtrag habe es hinbekommen.

    Zum speichern mache ich es so

    VB.NET-Quellcode

    1. Public Sub LoadDataSet(ByVal myDS As DataSet)
    2. myDS.Clear()
    3. myDS.ReadXml(OpenFileDialog1.FileName)
    4. End Sub
    5. Public Sub SaveDataSet(ByVal myDS As DataSet)
    6. myDS.WriteXml(SaveFileDialog1.FileName)
    7. myDS.AcceptChanges()
    8. End Sub
    9. Private Sub SpeichernToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SpeichernToolStripMenuItem.Click
    10. Validate()
    11. BewerbungBindingSource.EndEdit()
    12. 'SaveDataSet(Xmldataset)
    13. 'Refresh()
    14. SaveFileDialog1.Filter = "XML Datei (*.xml*)|*.xml"
    15. If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK _
    16. Then
    17. SaveDataSet(Xmldataset)
    18. Refresh()
    19. End If
    20. End Sub


    und zum laden so

    VB.NET-Quellcode

    1. Private Sub OpenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles OpenToolStripMenuItem.Click
    2. OpenFileDialog1.Title = "Wähle"
    3. OpenFileDialog1.Filter = "XML Datei|*.xml"
    4. If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
    5. LoadDataSet(Xmldataset)
    6. End If
    7. End Sub


    sicherlich gibt es bessere wege... Aber wenns klappt.

    Wäre doch dankbar wenn ihr mir auch einen anderen Weg zeigen könnt

    Bilder
    • dataset.png

      19,49 kB, 862×354, 166 mal angesehen

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

    Nuja, was willst Du denn noch verändern? Dass Du ne Dateiangabe für Save&Load brauchst, ist klar. Ob Du den Pfad nun fest im Code einbaust oder dem Benutzer die Chance gibst, eine Datei zu wählen, liegt in Deinem Ermessensspielraum. Aber wenn Du Auswahl gibst, ist es natürlich auch sinnvoll mit Dialogen zu arbeiten. Ob Du dafür jetzt allerdings gleich ne jeweilige Instanz auf dem Formular erzeugst, bleibt auch bei Dir. Ich würde immer nur ne prozedurinterne, also lokale OFD-/SFD-Instanz (OpenFileDialog/SaveFileDialog) erschaffen und nach der Verwendung gleich wieder entsorgen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @manni4545 Mach Dir ne separate Instanz vom Dialog und feddich:

    VB.NET-Quellcode

    1. Using dlg = New OpenFileDialog
    2. dlg.Filter = "XML|*.xml"
    3. If dlg.ShowDialog() != DialogResult.OK Then
    4. Return
    5. End If
    6. ' mit dlg.FileName was tun
    7. End Using
    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!
    morgen,
    erstmal ein Dank für die hinweise.

    mit saveFileDialog bzw. openFileDialog klappt es ja.

    hier mal das LoadDataSet u. das SaveDataSet

    VB.NET-Quellcode

    1. Public Sub LoadDataSet(ByVal myDS As DataSet)
    2. myDS.Clear()
    3. myDS.ReadXml(OpenFileDialog1.FileName)
    4. End Sub
    5. Public Sub SaveDataSet(ByVal myDS As DataSet)
    6. myDS.WriteXml(SaveFileDialog1.FileName)
    7. myDS.AcceptChanges()
    8. End Sub


    Beim Load wird mir das Dataset geladen ist ja richtig so.
    Wenn ich Speichern möchte, möchte ich ja nicht immer den SaveFileDialog verwenden. Nur wenn es an einen anderen Ort gespeichert werden soll.

    VB.NET-Quellcode

    1. Private Sub ÖffnenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ÖffnenToolStripMenuItem.Click
    2. OpenFileDialog1.Filter = "XML Datei|*.xml"
    3. OpenFileDialog1.FileName = "Datei auswählen"
    4. If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
    5. LoadDataSet(Xmldataset)
    6. End If
    7. End Sub
    8. Private Sub SpeichernUnterToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SpeichernUnterToolStripMenuItem.Click
    9. Validate()
    10. BewerbungBindingSource.EndEdit()
    11. SaveFileDialog1.FileName = "Bewerbung" 'Dateiname festlegen
    12. SaveFileDialog1.Filter = "XML Datei (*.xml*)|*.xml"
    13. If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK _
    14. Then
    15. SaveDataSet(Xmldataset)
    16. Refresh()
    17. End If
    18. End Sub
    19. Private Sub SpeichernToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles SpeichernToolStripMenuItem1.Click
    20. SaveDataSet(Xmldataset) 'So klappt es ja nicht. Da knallt es ja bei myDS.WriteXml(SaveFileDialog1.FileName) Warum ist mir klar
    21. End Sub


    hmm hab da keine Idee. Dafür fehlen mir halt noch die Kenntnisse

    manni4545 schrieb:

    Nur wenn es an einen anderen Ort gespeichert werden soll.
    Diese Information muss ja iwo herkommen.
    Nimm einen Button / Menüpuinkt Save und einen Save As und 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).
    Programmierfragen über PN / Konversation werden ignoriert!

    manni4545 schrieb:

    hab ich doch in einem ToolStripMenuItem
    Ja und?
    Wenn der Pfad vorhanden ist, kann eomfach gespeichert werden.
    Wenn kein Pfad vorhanden ist, musst Du immer Speichern unter aufrufen.
    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!

    manni4545 schrieb:

    Beim erstenmal sage ich speichern unter..
    Danach muss ich ja auch nur auf speichern klicken
    Das geht doch grundsätzlich genauso.

    VB.NET-Quellcode

    1. Validate()
    2. BewerbungBindingSource.EndEdit()
    3. If SaveFileDialog1.FileName Is Nothing Then
    4. SaveFileDialog1.FileName = "Bewerbung" 'Dateiname festlegen
    5. SaveFileDialog1.Filter = "XML Datei (*.xml*)|*.xml"
    6. If SaveFileDialog1.ShowDialog <> Windows.Forms.DialogResult.OK Then Exit Sub
    7. End If
    8. SaveDataSet(Xmldataset)
    9. Refresh()

    Sauberer wäre es m.E. allerdings, wenn Du keine klassenweite SFD-Instanz hast und somit FileName nicht als Quasivariable in anderen Subs verwendest. Aber wie Du willst.
    Besser: Du machst ne FileInfo (oder anfangs alternativ ne String-Variable), die erstmal leer ist. Wenn Du auf [Speichern] klickst, soll das Programm schauen, ob diese Variable schon mit Daten gefüllt ist. Wenn nicht, wird der SFD angezeigt und dann eben die FileInfo (bzw. nur der Dateipfad) in der Datei abgespeichert. Wenn in der Variablen doch schon Daten drin sind (weil man früher schon mal auf [Speichern] geklickt hat), werden diese Daten zum Speichern hergenommen und der SFD wird übersprungen. Also so wie oben, nur mit ner Variablen statt mit dem SFD.FileName.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Der TE hat einen WinForm OpenFileDialog und einen WinForm SaveFileDialog. So wie ich das verstanden habe, wird die XML nach dem Programmstart immer mit dem OpenFileDialog geöffnet.
    Ansonsten würde ich den Pfad der Datei eh in den Settings ablegen und natürlich die Settings auch prüfen (Leerstring, FileExists).
    Ich glaube nur, das der TE noch nicht so weit ist.

    Dksksm schrieb:

    Der TE hat einen WinForm OpenFileDialog und einen WinForm SaveFileDialog.
    Weiß ich. Ich dachte, das hätte ich in Post#4 schon klargemacht. Ich wollte jedoch nur (nochmal) klar machen, dass ich das nicht machen würde. Ich arbeite immer mit lokalen OFD-/SFD-Instanzen. Meines Erachtens wäre dies sauberer. Aber: Ansichtssache. Nur an den Namen sollte der TE noch etwas arbeiten. OpenFileDialog1 und SaveFileDialog1 sind jetzt nicht sooo kreativ/informativ.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Ich arbeite immer mit lokalen OFD-/SFD-Instanzen. Meines Erachtens wäre dies sauberer.
    Ich find's net unsauber, einen Designer-gestalteten Dialog zu benutzen. Deshalb werden sie ja vom Designer unterstützt.
    Da kann man auch gleich den Filter festlegen - das muss nicht im Code.
    Das schöne daran ist, wenn man denselben Dialog nochmal aufmacht, hat er den vorherigen Pfad nicht vergessen, sondern öffnet auf ihn - was meist ein guter Startpunkt ist.
    Hier Tut ühaupt zum Thema:Dialoge benutzen ist einfach