Wert übergeben

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

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

    Wert übergeben

    Guten Morgen Alle,

    ich habe im Internet ein Programm gefunden, dass mir in einen DataGridView eine ProgressBar anzeigt. Funktioniert auch klasse.
    Nun mein Problem. Ich habe in der Klasse 'ProgressCell' eine Abfrage eingebaut, mit der die Farbe der ProgressBar geändert wird. Leider kann ich den Wert nur fest vergeben hier z.B. 75.
    Ich würde ihn aber gerne von Aussen ändern können. Kann mir von Euch jemand helfen.
    Hier mal der Code.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim col As New ProgressColumn
    4. DataGridView1.Columns.Add(col)
    5. DataGridView1.Rows(0).Cells(0).Value = 74
    6. End Sub
    7. End Class
    8. Public Class ProgressColumn
    9. Inherits DataGridViewColumn
    10. Public Sub New()
    11. MyBase.New(New ProgressCell())
    12. End Sub
    13. Public Overrides Property CellTemplate() As DataGridViewCell
    14. Get
    15. Return MyBase.CellTemplate
    16. End Get
    17. Set(ByVal Value As DataGridViewCell)
    18. If Value IsNot Nothing And Not TypeOf (Value) Is ProgressCell Then
    19. Throw New InvalidCastException("Must be a ProgressCell")
    20. End If
    21. MyBase.CellTemplate = Value
    22. End Set
    23. End Property
    24. End Class
    25. Public Class ProgressCell
    26. Inherits DataGridViewImageCell
    27. Protected Overrides Function GetFormattedValue(ByVal value As Object, ByVal rowIndex As Integer, ByRef cellStyle As System.Windows.Forms.DataGridViewCellStyle, ByVal valueTypeConverter As System.ComponentModel.TypeConverter, ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter, ByVal context As System.Windows.Forms.DataGridViewDataErrorContexts) As Object
    28. Dim bmp As Bitmap = New Bitmap(Me.Size.Width, Me.Size.Height)
    29. Using g As Graphics = Graphics.FromImage(bmp)
    30. Dim percentage As Double = 0
    31. Double.TryParse(Me.Value.ToString(), percentage)
    32. Dim text As String = percentage.ToString() + " %"
    33. Dim f As Font = New Font("Arial Rounded MT", 9, FontStyle.Bold)
    34. Dim w As Integer = CType(g.MeasureString(text, f).Width, Integer)
    35. Dim h As Integer = CType(g.MeasureString(text, f).Height, Integer)
    36. g.DrawRectangle(Pens.Black, 2, 2, Me.Size.Width - 6, Me.Size.Height - 6)
    37. If percentage < 75 Then
    38. g.FillRectangle(Brushes.GreenYellow, 3, 3, CInt((Me.Size.Width - 6) * percentage / 100), CInt(Me.Size.Height - 7))
    39. Else
    40. g.FillRectangle(Brushes.Red, 3, 3, CInt((Me.Size.Width - 6) * percentage / 100), CInt(Me.Size.Height - 7))
    41. End If
    42. Dim rect As RectangleF = New RectangleF(0, 2, bmp.Width, bmp.Height)
    43. Dim sf As StringFormat = New StringFormat()
    44. sf.Alignment = StringAlignment.Center
    45. g.DrawString(text, f, Brushes.Black, rect, sf)
    46. End Using
    47. Return bmp
    48. End Function
    49. End Class


    Ich Danke Euch :)
    uh - das war bisserl vertrackt. Da musste man eine zusätzliche Property anbringen, und ausserdem das Clonen überschreiben, damit die Prop mitgeklont wurde.

    einen einfacheren Ansatz demonstriere ich hier: DatagridViewProgressCell
    Da zeichnet halt das Form die Zelle selber.
    Und dabei hat man natürlich jede Freiheit, auch annere Hintergrundfarben reinzumachen.

    Bei deim Snippet finde ich auch bedenklich, dass bei jedem GetFormattedValue eine Bitmap erzeugt wird - aber nirgends werden Bitamps disposed - das ist keine feiner Umgang mit Resourcen.