Speichern eines DGV mit ImageColumn

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

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

    Speichern eines DGV mit ImageColumn

    Hallo liebes Forum,

    Ich kämpfe seit einiger Zeit mit einem Problem. Und zwar habe ich ein DataGridView (list) mit insgesamt 8 Spalten, wobei die 1. eine ImageColumn und die Restlichen normale TextBoxColums sind. Jetzt wird die ImageColumn vom User mit einem Bild gefüllt. (Das Bild ist willkürlich und befindet sich somit weder in den Ressourcen noch in einer Datenbank). Der Link zum Bild wird in die 8. Spalte eingefügt. Meine Frage nun: Hätte jemand eine Idee, wie ich das gesamte DGV speichern kann, mitsamt dem Bild? Wenn es nur aus Text bestünde, gäbe es ja via .xml einfache Wege, aber mit einer ImageColumn bin ich leider ratlos... :(

    Mein Ansatz ist ziemlich notdürftig: Beim schließen der Form werden sämtliche Werte in der 8. Spalte (URL zum Bild) ausgelesen und Zeile für Zeile in ein Textfile geschrieben.

    VB.NET-Quellcode

    1. Public Function writetext(ByVal path As String, idnex As Integer) 'Zum Schreiben in die Text-Datei
    2. Dim counter As Integer = 0
    3. Dim objWriter As New System.IO.StreamWriter(path)
    4. For Each line As DataGridViewRow In list.Rows
    5. objWriter.WriteLine(list.Item(index, counter).Value)
    6. Console.WriteLine(list.Item(index, counter).Value)
    7. counter = counter + 1
    8. Next
    9. objWriter.Close()
    10. End Function
    11. Private Sub Main_Close(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.FormClosed
    12. writetext(Application.StartupPath & "/Saves" & "\img.txt", 7)
    13. End Sub


    Dann beim nächsten Start soll die Textdatei gelesen werden und für jede Zeile in der Datei eine Zeile im DGV erstellt und das Bild gesetzt werden...

    VB.NET-Quellcode

    1. Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim counter As Integer = 0
    3. For Each line As String In System.IO.File.ReadLines(Application.StartupPath & "/Saves" & "\img.txt")
    4. If line <> "" Then
    5. list.Rows.Add()
    6. My.Computer.Network.DownloadFile(line, Application.StartupPath & "/Saves" & "\" & counter & ".jpg")
    7. Dim img As Bitmap = Image.FromFile(Application.StartupPath & "/Saves" & "\" & counter & ".jpg")
    8. Console.WriteLine(line)
    9. list.Item(0, counter).Value = img
    10. img.Dispose()
    11. End If
    12. Next line
    13. End Sub


    Leider funktionniert das nicht so wie gewünscht und ehrlichgesagt habe ich keine Ahnung in welche Richtung ich überhaupt suchen soll... Hat da jemand eine Idee?

    Gruss CodeRed
    Umfangreicher Converter im Browser: CloudConvert
    Temporäre e-Mail: temp-mail
    Text-Übersetzter: DeepL
    Kostenloser Webspace: bplaced
    Hätte jemand eine Idee, wie ich das gesamte DGV speichern kann, mitsamt dem Bild?

    Man speichert kein DGV, sondern nur die Daten, die damit visualisiert werden.
    Du solltest die GUI von den Daten trennen und nicht im DGV herumstochern...
    Liegt ein Dataset mit einer Table in deinem Projekt vor?
    @CodeRed Du brauchst eine DataTable, die Du dann an das DGV hängen kannst.
    Um Bilder abzuspeichern, brauchst Du eine Image-Klasse, die XmlSerializable implementiert. Gugst Du hier (nicht getestet).
    Der rest geht dann über WriteXml() und ReadXml().
    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!