Bildpfad in Datagridview anzeigen

  • VB.NET

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

    Bildpfad in Datagridview anzeigen

    Hallo zusammen,
    in meine gebundene dataset wird ein bildpfad gespeichert, dies soll in DataGridView1.CurrentRow.Cells(9) angezeigt werden aber nicht als pfad sondern als bild, was mache ich da falsch?

    VB.NET-Quellcode

    1. For i = 0 To DataGridView1.Rows.Count - 1
    2. Dim bild As Image
    3. Using s As System.IO.FileStream = New IO.FileStream(Me.DataGridView1.CurrentRow.Cells(9).Value.ToString(), IO.FileMode.Open)
    4. bild = New Bitmap(s)
    5. DataGridView1.Rows(i).Cells.Item(9).Value = bild
    6. End Using
    7. Next
    Der Inhalt einer DGV-Cell kann von Haus aus nicht beides sein: Text und Bild. Entweder ist die betroffene Spalte eine TextColumn oder eine ImageColumn.
    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.
    gugge Icons im DatagridView und das CellFormatting-Event
    Aber das setzt voraus, dass alle Bilder bereits im Voraus geladen sind.
    Anders ist eine performante Darstellung von Bildern im DGV auch nicht möglich.
    Dann aber wiederum sind viele Bilder in einem DGV problematisch, weil mw. 100 bilder zu je 2 MegaPixel - da ist iwann Schicht im Schacht.

    Da muss man sich dann was intelligentes ausdenken, einen Cache, der auch nur Thumbnails der Bilder vorhält.
    @guccini Nein.
    Gib der Spalte den Typ DataGridViewImageColumn.
    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!
    naja - wie mein Tut, und v.a. meine Einlassungen aussagen: Damit ists bei weitem noch nicht getan.

    guccini schrieb:

    also im klartext wäre besser ein picturebox zu benutzen? also cell(9)->picturebox?
    Ähm - das ist das komplette Gegenteil von Klartext.
    Eine DGV-Zelle kann man nicht durch eine Picturebox ersetzen - wie willst du die denn ins DGV einbasteln??
    wenn ich deine eigentümliche, nicht-sprachliche Pfeilchen-Syntax mal zu übersetzen versuchen darf:
    Du möchtest in einer DGV-Zelle ein Bild anzeigen, geladen aus derjenigen Datei, deren Pfad im Datensatz angegeben ist. - Ist es das, was du möchtest?

    Ich sags nocheinmal: In meim Tut wird prinzipiell gezeigt, wie man Bilder in DGV-Zellen zur Ansicht bringt.

    Allerdings - ebenfalls wie gesagt - wird es wesentlich komplizierter, wenn es sich um Bilder handelt, die aus Dateien zu laden sind.
    Denn das Laden ist viel zu langsam.
    Und viele Bilder in voller Größe im Speicher halten frisst ungeheuer viel Speicherplatz.
    Daher ist ein durchdachtes Caching vonnöten, und Thumbnails müssen gebildet werden.

    Aber vlt. irre ich mich ja auch, und es haut doch so leidlich hin.
    Also gehe vor wie im Tut gezeigt: Bastel eine ImageColumn ins DGV, und behandle das Formatting-Event, und weise darin das gewünschte Bild an e.Value zu. Ist alles gezeigt im Tut.
    Hi EDR.....danke für die aufklärung, habe das so formuliert damit das verständlich rüber kommt was ich damit vor habe.
    NOCHMAL: dein Tut habe ich mir angeguckt und ist auf jeden fall akzeptabel, jedoch wollte ich gerne ausprobieren wie das funktioniert, cell-pfad zu cell-bild, wäre schön wenn mir das eine zeigen würde. die datenbank wird auch nicht gross ausfallen, danke nochmal für dein/euer verständniss.
    Dann eben ich: Auch das steht im Tut. Du nimmst den CellFormatting-EventHandler her und packst dann codetechnisch das Bild in die Zelle. Wie man von Pfad auf Bild kommt, ja, das steht explizit nicht im Tut, da - wie vom EdR erklärt - es wahrscheinlich inperformant ist, aber das wär ja ne 5-Sekunden-Internet-Suche: Machbar z.B. mit

    VB.NET-Quellcode

    1. DeinDGV.Item(9, e.ColumnIndex).Value = New Bitmap(DeinDGV.Item(8, e.ColumnIndex).Value.ToString)
    Alternativ auch möglich über den BindingSource_CurrentChanged-EventHandler und dann mit Current und dem DataTable-Wert.
    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.
    ja du warst etwas schneller,das von EDR ist angekommen, habe das auch so verstanden aber mit diese fehlermeldung

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    2. DataGridView1.Item(9, e.ColumnIndex).Value = New Bitmap(DataGridView1.Item(8, e.ColumnIndex).Value.ToString)
    3. End Sub


    Fehler:
    Eine Ausnahme vom Typ "System.ArgumentException" ist in mscorlib.dll aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.

    Zusätzliche Informationen: Der Pfad hat ein ungültiges Format.
    Na dann: Überprüf erstmal mit IO.FileExists(DeinPfad), ob der Pfad in Spalte 8 existiert, bevor Du daraus ein Bild erstellst. Und wenn nicht, schau nach, ob da unsichtbare Whitespaces drin sind, z.B. Zeilenumbrüche etc.
    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.
    Shame on you and shame on me :P . IntellSense hätte die Antwort parat gehabt. 8 und 9 sind ja schon die ColumnIndizes. Die RowIndices sind richtig.

    VB.NET-Quellcode

    1. DataGridView1.Item(9, e.RowIndex).Value = New Bitmap(DataGridView1.Item(8, e.RowIndex).Value.ToString)

    Allerdings wird bei mir das CellFomatting-Event dauerhaft gefeuert. Also vielleicht nicht immer optimal.
    So klappt es ganz gut:

    VB.NET-Quellcode

    1. Private Sub ImagesDataGridView_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles ImagesDataGridView.CellValueChanged
    2. If e.ColumnIndex <> 8 OrElse ImagesDataGridView.RowCount = 0 OrElse ImagesDataGridView.Item(8, e.RowIndex).Value Is Nothing OrElse Not IO.FileExists(ImagesDataGridView.Item(8, e.RowIndex).Value.ToString) Then Exit Sub
    3. ImagesDataGridView.Item(9, e.RowIndex).Value = New Bitmap(ImagesDataGridView.Item(8, e.RowIndex).Value.ToString)
    4. End Sub

    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.

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

    bleibt weiterhin ohne bild

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
    2. If e.ColumnIndex <> 9 OrElse DataGridView1.RowCount = 0 OrElse DataGridView1.Item(9, e.RowIndex).Value Is Nothing OrElse Not IO.File.Exists(DataGridView1.Item(9, e.RowIndex).Value.ToString) Then Exit Sub
    3. DataGridView1.Item(10, e.RowIndex).Value = New Bitmap(DataGridView1.Item(9, e.RowIndex).Value.ToString)
    4. End Sub

    Na Moment. Jetzt hast Du in Zeile#3 andere Indices (10 und 9) als in Z#2 (nur 9). Ist Bull***
    Welchen Index haben denn Text- und Bild-Spalte bei Dir?
    Wie befüllst Du die Textspalte?
    Bei mir läuft es testweise damit:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. DataGridView1.Rows.Add()
    3. DataGridView1.Item(0, DataGridView1.RowCount - 2).Value = DerIconPfad
    4. End Sub
    5. Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
    6. If e.ColumnIndex <> 0 OrElse e.RowIndex = -1 OrElse DataGridView1.RowCount = 0 OrElse DataGridView1.Item(0, e.RowIndex).Value Is Nothing OrElse Not IO.File.Exists(DataGridView1.Item(0, e.RowIndex).Value.ToString) Then Exit Sub
    7. DataGridView1.Item(1, e.RowIndex).Value = New Bitmap(DataGridView1.Item(0, e.RowIndex).Value.ToString)
    8. End Sub

    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.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    cell 9 = pfad
    cell 10 = image

    ich befülle es gebunden an eine dataset(xml)

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim dr5 As DialogResult = MessageBox.Show("", "Zeile Speichern", MessageBoxButtons.YesNo)
    3. If dr5 = DialogResult.Yes Then
    4. Me.Tools.toolswerkzeuge.WriteXml("C:\test\test1.Dataset")
    5. DataGridView1.Refresh()
    6. ElseIf dr5 = System.Windows.Forms.DialogResult.No Then
    7. End If
    8. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „guccini“ ()

    @guccini Bei mir läuft dies:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim path As String = "C:\Temp\Überziehen.jpg"
    3. Using s As System.IO.FileStream = New IO.FileStream(path, IO.FileMode.Open)
    4. Dim bild = New Bitmap(s)
    5. DataGridView1.Rows(0).Cells.Item(0).Value = bild ' Spalte 0: Bild
    6. DataGridView1.Rows(0).Cells.Item(1).Value = path ' Spalte 1: Pfad
    7. End Using
    8. End Sub
    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!