Bilder in einer Custom DataGridView Column flackern

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Bilder in einer Custom DataGridView Column flackern

    Hallo zusammen!

    Ich habe mir für eine Datenbank eine Custom DataGridView Column gebaut, die mir auf Grundlage
    eines Standartpfads in Kombination eines Wertes eines Datenbankfeldes, Bilder in einem DataGridView
    anzeigt. Grundsätzlich funktioniert das gut und bei manchen (!) DataGridViews geht mein Ansatz auch
    ohne Probleme, aber bei machen(?!) DGV flackern die Bilder und der Scrollbalken verschwindet.

    Hier mein Code:

    Die Custom-Column:

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Public Class SLDGVDBImageColumn
    3. Inherits DataGridViewImageColumn
    4. Public Property pathTemplate As String
    5. Public Property placeHolder As String = "@"
    6. Public Property isAbsolute As Boolean = False
    7. Public Sub New()
    8. Dim c As SLDGVDBImageCell = New SLDGVDBImageCell()
    9. Me.CellTemplate = c
    10. Me.ReadOnly = True
    11. End Sub
    12. Public Overrides Function Clone() As Object
    13. Dim newObj As SLDGVDBImageColumn = MyBase.Clone()
    14. With newObj
    15. .pathTemplate = Me.pathTemplate
    16. .placeHolder = Me.placeHolder
    17. .isAbsolute = Me.isAbsolute
    18. End With
    19. Return newObj
    20. End Function
    21. End Class


    Die Custom-Cell:

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Imports System.Drawing
    3. Imports System.IO
    4. Public Class SLDGVDBImageCell
    5. Inherits DataGridViewImageCell
    6. Public Sub New()
    7. End Sub
    8. Protected Overrides Function GetValue(ByVal rowIndex As Integer) As Object
    9. Dim myColumn As SLDGVDBImageColumn = CType(Me.DataGridView.Columns(Me.ColumnIndex), SLDGVDBImageColumn)
    10. Dim value As Image = Nothing
    11. If Not MyBase.GetValue(rowIndex) Is DBNull.Value Then
    12. If Not MyBase.GetValue(rowIndex).ToString = "" Then
    13. Dim pathString As String = Replace(myColumn.pathTemplate, myColumn.placeHolder, MyBase.GetValue(rowIndex).ToString)
    14. If Not myColumn.isAbsolute Then
    15. pathString = Application.StartupPath & "" & pathString
    16. End If
    17. If Not myColumn.pathTemplate = "" Then
    18. If My.Computer.FileSystem.FileExists(pathString) Then
    19. Me.ImageLayout = DataGridViewImageCellLayout.Zoom
    20. Using fs As New FileStream(pathString, FileMode.Open, FileAccess.Read)
    21. Dim img = Image.FromStream(fs)
    22. Return img
    23. End Using
    24. Else
    25. Me.ImageLayout = DataGridViewImageCellLayout.Normal
    26. End If
    27. End If
    28. End If
    29. End If
    30. Return value
    31. End Function
    32. End Class


    Habe ich irgendwo einen sehr groben Schnitzer oder will mich VB einfach nur
    manchmal ärgern? 8|

    Vielen Dank schon mal für eure Hilfe!
    hast du mal eine Debug-Ausgabe gemacht, wie oft GetObject aufgerufen wird? weil da jedesmal eine Datei zu laden - hmm, hmm....

    was ist eigentlich die Arbeitsweise dieser Column - soll die als Bild anzeigen, was als Dateipfad in den Daten vorliegt?
    Da würde eigentlich das Formatting-Event glaub reichen.
    Nur eben das Performance-Problem, dass man die Bitmaps iwie cachen müsste...