Image in DGV zur Laufzeit ändern

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Sportverein_Vorsitz.

    Image in DGV zur Laufzeit ändern

    Als erstes mal der Code:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles UmsatzDGV.CellFormatting
    2. If (e.RowIndex <> -1) Then
    3. Select Case e.ColumnIndex
    4. Case 2
    5. If (FiBuHelper.GetBuchungsartById(CType(sender, DataGridView).Rows(e.RowIndex).Cells(3).Value) = "Entnahme") Then
    6. CType(sender, DataGridView).Rows(e.RowIndex).Cells(e.ColumnIndex).Style.ForeColor = Color.Red
    7. Else
    8. CType(sender, DataGridView).Rows(e.RowIndex).Cells(e.ColumnIndex).Style.ForeColor = Color.Black
    9. End If
    10. Case 4
    11. CType(sender, DataGridView).Rows(e.RowIndex).Cells(e.ColumnIndex).Value = FiBuHelper.GetBuchungsartById(CType(sender, DataGridView).Rows(e.RowIndex).Cells(3).Value)
    12. Case 8
    13. Try
    14. Dim dbi As DataRowView = CType(sender, DataGridView).Rows(e.RowIndex).DataBoundItem
    15. Dim CellImage As New DataGridViewImageCell
    16. CellImage.ValueIsIcon = True
    17. If (dbi!BelegFile IsNot DBNull.Value) Then
    18. CellImage.Value = My.Resources.Scanner
    19. Else
    20. CellImage.Value = My.Resources.NoScanner
    21. End If
    22. CType(sender, DataGridView).Rows(e.RowIndex).Cells(e.ColumnIndex).Value = New Bitmap(16, 16)
    23. Catch ex As Exception
    24. FiBuHelper.LoggingError(ex)
    25. End Try
    26. End Select
    27. End If
    28. End Sub

    Nun zum Problem: Ich habe ein DGV welches an eine DataView gebunden ist. Über die o.g. Funktion soll in der letzten Spalte abhängig von dem DataBoundItem Inhalt jeweils ein verschiedenes Bild aus My.Ressources angezeigt werden. Es handelt sich auch um eine DataGridViewImageCell. Wenn ich das Programm starte, h#ngt es sich sofort auf. Ich erhalte nicht mal annähernd eine Exception.
    Ich bin Euch für jeden Hinweis dankbar.
    Gruß Ronny

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

    jetzt, wo ich deine Methode lesen kann ( :thumbsup: :thumbsup: ) denke ich, die ist ungeeignet, weil sie eh viel zu rechenintensive Vorgänge beinhaltet (Bitmap erstellen, und was dieses FiBu-Dingens macht könnte einen die Schweißperlen auf die Stirn treiben - weissichnich ;))

    sieht iwie aus, als wollest du eine Darstellung datenabhängig modifizieren - ein Fall für OwnerDrawing:
    coloriertes DatagridView
    noch ein coloriertes Datagridview


    Letzteres zeichnet sogar ein Bildle in eine Zelle.
    Dabei ist wichtig, nicht erst beim Zeichnen das Bild zu erstellen, sondern die infragekommenden Bilder in einem Array bereitzuhalten, und nurnoch abzurufen.
    wat? willst du mich veräppeln?

    VB.NET-Quellcode

    1. If (FiBuHelper.GetBuchungsartById(CType(sender, DataGridView).Rows(e.RowIndex).Cells(3).Value) = "Entnahme") Then
    2. CType(sender, DataGridView).Rows(e.RowIndex).Cells(e.ColumnIndex).Style.ForeColor = Color.Red
    was man daran sehen kann, ist, dass du strict Off proggst, aber mit Fehlerbehandlung ... - kannst du das näher erklären - wie das mit Fehlerbehandlung zu tun hat?

    wichtig: Option Strict On!
    Wenn´s was bringt, würde ic hdich auch veräppeln, wobei ich mit meinem iPhone doch recht zufrieden bin. So zurück zum Kern (Nein nicht der im Apfel). Das Option On Problem habe ich erkannt, und auch gerade geändert. So, nachdem mir VS über 42 Fehlermeldungen ausgespcukt hatte. Es ist unglaublich wie bescheiden man doch programmiert und immer wieder denkt, alles läuft. Aber dafür gibt es ja solche Helfer wie dich und andere hier.

    Weiterhin habe ich mal eben die Variante mit der Cellpainting Methode ausprobiert und offensichtlich habe ich mir zu wenig Zeit dafür genommen, oder ich kapier die Methode einfach nicht. Er flackert permanent mit dem Images in der Tabelle bzw. zeichnet diese nicht komplett.

    ich werde weiter probieren...Danke trotzdem
    Ich werde das problem erstmal hintenran stellen, da ich mir schon seit tagen den Kopf zerbreche und ich eigentlich keine Zeit habe für solche Kleinigkeiten. Danke dennoch erstmal für Eure Hilfe, das eigentliche programm muss erstmal fertig werden.

    Ach ja, wen´s interessiert: FiBu Kassenbuch nennt sich´s und soll meinem Schatzmeister(in) unter die Arme greifen bei der Bewältigung der Buchungen innerhalb unseres Vereins

    Problem gelöst

    Wer suchet, der findet. Man muss das neue Bild an das EventArgs:Value übergeben, dann funktioniert es...
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles UmsatzDGV.CellFormatting
    2. If (e.RowIndex <> -1) Then
    3. Select Case e.ColumnIndex
    4. Case 2
    5. If (FiBuHelper.GetBuchungsartById(CInt(CType(sender, DataGridView).Rows(e.RowIndex).Cells(3).Value)) = "Entnahme") Then
    6. CType(sender, DataGridView).Rows(e.RowIndex).Cells(e.ColumnIndex).Style.ForeColor = Color.Red
    7. Else
    8. CType(sender, DataGridView).Rows(e.RowIndex).Cells(e.ColumnIndex).Style.ForeColor = Color.Black
    9. End If
    10. Case 4
    11. e.Value = FiBuHelper.GetBuchungsartById(CInt(CType(sender, DataGridView).Rows(e.RowIndex).Cells(3).Value))
    12. Case 8
    13. Dim dbi = DirectCast(UmsatzDGV.Rows(e.RowIndex).DataBoundItem, DataRowView)
    14. Dim dbRow = DirectCast(dbi.Row, KasseDataset.BuchungenRow)
    15. If (dbRow.BelegFile.Length > 0) Then
    16. e.Value = My.Resources.Scanner
    17. Else
    18. e.Value = My.Resources.NoScanner
    19. End If
    20. End Select
    21. End If
    22. End Sub



    Danke trotzdem für alle Tipps und Hinweise.

    Hier mal noch ein Screenshot dazu (es ging um die äußerste Spalte rechts zur Anzeige ob ein Scanbeleg dabei ist, oder nicht)
    Bilder
    • vbparadiseloesung.jpg

      56,42 kB, 640×470, 198 mal angesehen
    jo, du hast recht!

    CellFormatting bedeutet, dass der eigentliche DatenWert in einen fürs DGV darstellbaren Wert umgewandelt wird - das muß garnicht immer ein String sein.
    Eben hier im Falle einer ImageColumn ists genau korrekt, dass das Umwandlungs-Ergebnis ein Image ist.

    Übrigens für die anneren Spalten kannst du einfach unverrichteter Dinge returnen - dann zeigt das DGV halt den Wert an, den es eh angezeigt hätte.

    Ups - was noch wichtig ist: Wenn du eine Umwandlung vornimmst, dann sollteste auch e.FormattingApplied= True setzen
    Na, wenn du e.Value änderst, dann hast du formatiert, und dann scheints mir nur logisch, dem Eventargs mitzuteilen, dass du Formatting applied hast.
    Denn normalerweise formatiert ja das DGV selbst, aber genau das solls jetzt ja lassen, denn sonst überschreibts deine Formatierung womöglich noch. (naja, scheinbar scheints in diesem Falle keine sichtbaren Negativ-Auswirkungen zu haben, aber wie gesagt: gewissermaßen der programmiererische Anstand...)

    Wo du die Zeile hinklatschst ist schnurz.
    Versteh einfach das Konzept des Formatting - Events: Das DGV schickt es los, und du kannst dieses Event behandeln, einen Wert reinschreiben, oder du lässtes halt. Anschließend guckt das DGV sich das Eventargs an, ob du was damit gemacht hast, und verwendet das dann für die Anzeige.