Bildpfad in Datagridview anzeigen

  • VB.NET

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

    Hmm - ist fast ärgerlich, dass sich kein einziger code-vorschlag auf das bezieht, was im Tut steht - nämlich dass dem e.Value des CellFormatting-EventArgs ein Image zugewiesen wird.

    Beachte: DataGridView1.Item(9, e.ColumnIndex).Value ist nicht: e.Value - also den Unterschied sollte man schon bemerken.
    Weiters muss man natürlich e.RowIndex und e.ColumnIndex checken und ausschliessen, dass das CellFormatting einer Zelle verarbeitet wird, welche gar keine DgvImagCell ist, oder welche sich in der ZufügeZeile befindet, also leer bleiben muss.

    Bitte aufhören mit Button_Click und CellValueChanged und anneren Suboptimalitäten oder gar Holzwegen.
    Das event heisst .CellFormatting, und ist optimal geeignet, um Images in ImageColumns anzuzeigen, insbesondere bei Verwendung typisierten Databindings.

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

    Hi EDR, habe versucht dein Rat zu folgen, folgendes : hab in Datatable zeile 11 also dor wo mein bild angezeigt werden soll von System.String auf System.Object geändert und scheint zu klappen aber mit diese fehlermeldung

    Zusätzliche Informationen: Der Pfad hat ein ungültiges Format.


    VB.NET-Quellcode

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


    Bitte lesen. Lesen!!

    ErfinderDesRades schrieb:

    ...dem e.Value des CellFormatting-EventArgs ein Image zugewiesen wird.
    Beachte: DataGridView1.Item(9, e.ColumnIndex).Value ist nicht: e.Value - also den Unterschied sollte man schon bemerken.
    Und - weist du etwas an e.Value zu?
    An e.Value!!!!
    (oder weisst du etwa garnet, was eine Zuweisung ist? - das ist das mit dem = -Zeichen)



    Aber das hat nix mit deiner Fehlermeldung zu tun. Deine Fehlermeldung sagt nur, dass der Pfad ein ungültiges Format hat.
    Also was bei DataGridView1.Item(9, e.RowIndex).Value.ToString rauskommt ist ungültig - deshalb kann die Bitmap nicht erstellt werden.
    Das kannst du nun wortreich bestreiten, und die Gültigkeit behaupten, aber in 99% derartiger Fälle behält am Ende der Computer recht.

    Hmm - das ist eiglich prima - da kannst du nun Debuggen lernen.
    Weil du musst, wenn der Fehler auftritt, herausbekommen, was genau bei DataGridView1.Item(9, e.RowIndex).Value.ToString rauskommt.
    Dazu erzeugst du den Fehler, und markierst dann im Code genau diesen Ausdruck: DataGridView1.Item(9, e.RowIndex).Value.ToString - kein Zeichen mehr, kein Zeichen weniger.
    Dann Kontextmenü "Schnellüberwachung" anklicksen, da wird der Wert angezeigt.
    Die Anzeige ist evtl. zu fuzzelig, daher klickste beim Wert auf die kleine Lupe, dann wird der Wert in einem Extra-Form angezeigt, aus dem du ihn auskopieren kannst, und dann hier posten.

    guccini schrieb:

    Zusätzliche Informationen: Der Pfad hat ein ungültiges Format.
    Da hilft keine rote Farbe, die ist den Moderatoren vorbehalten.
    Da hilft Debuggen. Haltepunkt reinsetzen und aufklären: Debuggen, Fehler finden und beseitigen
    ========
    Es soll ja Leute geben, die sind so arrogant zu glauben, dass der von ihnen geschriebene Code fehlerfrei sei. :cursing:
    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 wir wollen uns nicht auf rote grüne oder blaue farbe konzentrieren, e.value soviel ich weiss ist auf object bezogen, da ich noch vieles lernen muss veruche ich das dem entsprechend umzusetzten....da kann ich nur von euch lernen, deswegen nicht böse sein. ich werde mein code neue aufsetzten da mir das abgeschmiert ist, musste mein pc neu starten, keine ahnung woran das liegt....
    Leg dir am Besten ein Dictionary<string, Bitmap> an. Wenn ein Pfad im Dictionary nicht vorhanden ist, lädst du die Bitmap, skalierst sie auf 16x16px und fügst sie dem Dictionary hinzu. Ist der Pfad im Dict. vorhanden, nimmst du diese Bitmap. Wenn die Bildchen nicht mehr gebraucht werden alle Disposen.
    ja, aber das kommt erst viel später.
    Zunächst muss guccini lesen lernen - s.post#24
    Dann sprechen lernen.
    Weil eine Wort-Zusammenstellungen wie

    guccini schrieb:

    e.value soviel ich weiss ist auf object bezogen
    ergibt ja gar keinen Sinn.
    "Ebenso wie"

    guccini schrieb:

    also cell(9)->picturebox?

    guccini schrieb:

    von cell(8) bild_pfad -----> cell(9) DataGridViewImageColumn pic zu sehn?

    guccini schrieb:

    eine nicht gebundene DGV, da sich die daten in einer dataset(xml) befinden

    Solange aber seine Äusserungen keinen Sinn ergeben ist da auch nix verstanden, nichtmal die 3 Codezeilen aus dem Tut (sorry dassich das so ungeschminkt sage).
    Und solange braucht man auch nicht mit Vorschlägen zum Caching der Images zu kommen (um die absehbar miserable Performance wieder hinzukriegen).
    Und noch vorher muss wohl geklärt (debuggt) werden, was es mit dem ungültig formatierten Pfad auf sich hat.
    Hi EDR, post 28 hättest du dir ersparen können.....
    mag sein das ich in deutsch nicht mächtig bin aber eine gewisse aroganz muss nicht sein...
    die 3 codezeilen aus deinem tut

    VB.NET-Quellcode

    1. Import Verständniss
    2. Import Gedult
    3. Import Respekt

    vielleicht hast du das auch verstanden
    keiner hat dich gezwungen zu antworten
    Sorry aber was du das schreibst ist Respektlos
    Sorry wenn ich mich hier mal einklicke. Eine Frage an @guccini

    Was spricht den dagegen nur ein Pfad im DGV zu erwähnen und ein PictureBox das neben der DGV ist. Sobald man eine row anklickt, wird gleich das entsprechende Bild angezeigt. siehe Anhang

    Ist doch viel recourcenschonender.

    Zum Anhang: Ist bestimmt nicht professionell gelöst, soll nur zeigen wie ich es mir gedacht habe.

    Freundliche Grüsse

    exc-jdbi
    Dateien
    • DGVAndImages.zip

      (190,55 kB, 13 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    2. if e.ColumnIndex <> 9 then return
    3. dim sFile = DataGridView1.Item(9, e.RowIndex).Value.ToString
    4. e.Value = New Bitmap(sFile)
    5. e.FormattingApplied = True
    6. End Sub


    @exc-jdbi: Jo, das ist ein alternatives Konzept, um gespeicherte Bild-Pfade als Bilder zu präsentieren - hat viele Vorteile, und nur den kleinen Nachteil, dass man immer nur 1 Bild sieht, nämlich das aktuell selektierte.
    Dazu habich auch ein Sample, wie das mit Mit Databinding an Picturebox.Location sehr elegant umsetzbar ist: PictureViewer (sogar mit Video).

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich bekenne mich schuldig: Ich habe ein Verständnisproblem beim Tut (daher stellt sich die Frage, ob dieser Post zum Tut soll, hier bleibt oder ein eigener Thread eröffnet werden soll, da es ja irgendwie auch hierher gehört.) e.Value wird im CellFormatting-EventHandler ersetzt. Von Integer zu Image/Bitmap, whatever. Hab ich probiert:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private ImageList As New List(Of Bitmap)
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. ImageList.Add(New Bitmap(PfadZuEinemExistierendenBild))
    5. If IO.File.Exists("Test.xml") Then Tds.ReadXml("Test.xml")
    6. End Sub
    7. Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    8. If e.ColumnIndex <> 1 Then Exit Sub
    9. e.Value = ImageList(CInt(e.Value))
    10. 'e.FormattingApplied = True 'ob an oder aus: gleicher Effekt
    11. End Sub
    12. End Class
    Der Knackpunkt: Beim nächsten mal, wenn der Compiler vorbeikommt, sieht der natürlich: Ah, e.Value ist ja gar kein Integer mehr, sondern ein(e?) Bitmap -> Fehler. In der Source des Tuts kommt hingegen immer ein Integer in e.Value an. Wo ist der Fehler in meiner Denkweise? Welche Magie habe ich übersehen?

    btw: Im Tut wird mit e.FormattingApplied gearbeitet, in der Source hingegen nicht. Denn?

    ##########



    Ich hab das CellFormatting-Event 2x abonniert. Im 1. EventHandler ist zu Beginn e.Value vom Typ Integer. Soweit klar. Nach der Zuweisung ist e.Value vom Typ Bitmap. Im 2. EventHandler wird mir in der Tut-Source als auch in meinem Code bestätigt, dass e.Value immer noch vom Typ Bitmap ist. Nur beim relativ schnell wieder auftretenden CellFormatting-Event wird im 1. EventHandler bei mir gemotzt, während - wie geschrieben - in der Tut-Source Integer wieder da sind. Ich hab versucht, den relevanten Unterschied zwischen Tut-Code und meinem Code zu finden, hatte aber bisher keinen Erfolg.
    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“ ()

    VaporiZed schrieb:

    Ich hab das CellFormatting-Event 2x abonniert.
    Jo, das ist wohl keine gute Idee.
    Weil wenn 2 Handler dasselbe Event abonnieren, wird jedem auch dasselbe Eventargs gegeben. Und wenn das im ersten Handler verändert wurde, kommts im 2. Handler eben verändert an.
    Genau dafür kann man nu das .FormattingApplied nutzen: Damit, wenn es angibt, dass e.Value bereits formatiert ist, dass man dann nicht versucht, nochmal zu formatieren.

    Coole Sache - mir ist damals auch aufgefallen, dasses ühaupt keinen Unterschied macht.
    Nur dachte ich (gestern, nachträglich), dass wenn es diese Property gibt, dann liegt man sicherlich auf der sichereren Seite, wenn man sie dann auch setzt, wenn man eine Formatierung ausgeführt hat.

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

    ErfinderDesRades schrieb:

    Weil wenn 2 Handler dasselbe Event abonnieren, wird jedem auch dasselbe Eventargs gegeben. Und wenn das im ersten Handler verändert wurde, kommts im 2. Handler eben verändert an.
    Das ist auch Sinn der Sache, da ich im 2. EventHandler mir ja nur den aktuellen Typ von e.Value zurückgeben lasse. Und da sehe ich, dass durch den 1. EventHandler e.Value von Integer auf Bitmap wechselt. Was ja auch so sein soll. Nur wenn eben das Event nochmals gefeuert wird, dann ist im ersten EventHandler eben ein Unterschied zwischen Deinem und meinem Code (und zwar unabhängig davon, ob der 2. EventHandler da ist oder nicht)*. Beim 1. Event meldet der 1. EventHandler bei uns beiden: e.Value ist vom Typ Integer. Wenn das Event nochmal vom System gefeuert wird, wird bei mir im 1. EventHandler gemeldet: e.Value ist vom Typ Bitmap, bei Dir Integer.

    * Ich habe den 2. EventHandler auch in Deinem Tut-Sourcecode eingebaut. Da wird natürlich durch die Abänderung im 1. EventHandler auch gemeldet, dass e.Value nun vom Typ Bitmap ist. Aber wenn eben das Event nochmal kommt, dann ist auch bei Dir wieder im 1. EventHandler e.Value vom Typ Integer. Der 2. EventHandler hat keinen Einfluss. Weder auf meinen noch auf Deinen Code.

    Nochmal zusammengefasst:
    Bei Dir:
    • Event wird gefeuert
    • 1. EventHandler meldet: Typ von e.Value ist Integer
    • 1. EventHandler ändert den Typ von e.Value von Integer auf Bitmap
    • 2. EventHandler meldet: Typ von e.Value ist Bitmap
    • 2. Event wird gefeuert
    • 1. EventHandler meldet: Typ von e.Value ist Integer
    • 1. EventHandler ändert den Typ von e.Value von Integer auf Bitmap
    • 2. EventHandler meldet: Typ von e.Value ist Bitmap
    Bei mir:
    • Event wird gefeuert
    • 1. EventHandler meldet: Typ von e.Value ist Integer
    • 1. EventHandler ändert den Typ von e.Value von Integer auf Bitmap
    • 2. EventHandler meldet: Typ von e.Value ist Bitmap
    • 2. Event wird gefeuert
    • 1. EventHandler meldet: Typ von e.Value ist Bitmap
    • 1. EventHandler rebelliert beim Änderungsversuch von nun Bitmap auf Bitmap

    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.
    Bei einer gebundenen DGV-Spalte?
    Und die für diese Spalte angebundene DataRow-Property ist vom Typ Integer? Und kommt im Formatting-Event trotzdem als Bitmap raus?
    Sehr Merkwürden.
    Und - wenn du FormattingApplied setzst - welchen Wert hat das in dem Moment, wenn das nächste FormattingEvent dann mit der Bitmap ankommt?
    Ah, Problem gefunden und gelöst. Der Knackpunkt war, dass es erlaubt war, dass dem DGV neue Zeilen hinzugefügt werden dürfen. Und in der "letzten" Zeile (die für neue Daten vorgesehen ist), verhaspelt sich der Compiler. Klar, ist ja kein Integerwert, sondern ein(e) Default-Bitmap drin.
    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.
    Argh, ich vergaß. Unabhängig davon, ob FormattingApplied explizit im 1. EventHandler auf True oder False gesetzt oder eben gar nicht auf irgendeinen Wert von mir gesetzt wird, wird der 2. EventHandler mit e.Value als Bitmap aufgerufen. Ich hoffe, dass das die Frage beantwortet und das Interesse befriedigt.
    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“ ()

    ja das ist schon klar, das sagte ich ja bereits: Wenn der 1. Eventhandler in e.value eine Bitmap reinmacht, dann kann im 2. Eventhandler logischerweise nix anneres drinne sein als eine Bitmap.
    Deswegen hatte ich ja gedacht, man solle auf .FormattingApplied testen, so:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    2. If e.ColumnIndex <> 0 OrElse e.FormattingApplied Then Return
    3. e.Value = _Images(CInt(e.Value))
    4. e.FormattingApplied = True
    5. End Sub
    Aber das nützt nix mitte Zufügezeile, wo das auto-default-Image reingelegt wird.
    Weil - das habich jetzt nachgeguckt - dann steht .FormattingApplied nämlich auf false.
    Also sichert man ab entweder indem man den Typ abfragt, oder indem man die Zufügezeile vonne Formatierung ausschließt:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    2. If e.ColumnIndex <> 0 OrElse e.RowIndex = NumbBindingSource.Count Then Return
    3. e.Value = _Images(CInt(e.Value))
    4. e.FormattingApplied = True
    5. End Sub
    Wozu nu das .FormattingApplied gut ist, ob das intern verwendet wird, oder tatsächlich nur für den sonderlichen Sonderfall, dass jmd das Event 2* abonniert - ich k.A.