PropertyGrid Eigenschaft mit eigenem Objekt

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Pascal J..

    PropertyGrid Eigenschaft mit eigenem Objekt

    Hi,
    ich arbeite momentan an ein Projekt, und dort benötige ich das PropertyControl. Für bestimmte Daten habe ich jetzt ein eigenes Objekt erstellt.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Kosten
    2. Private _Aktiv As Integer
    3. Private _Inaktiv As Integer
    4. ''' <summary>
    5. ''' Erstellt ein neues KostenObjekt. Aktive und Inaktive Kosten sind = 0
    6. ''' </summary>
    7. ''' <remarks></remarks>
    8. Public Sub New()
    9. _Aktiv = 0
    10. _Inaktiv = 0
    11. End Sub
    12. ''' <summary>
    13. ''' Erstellt ein neues KostenObjekt. InAktive kosten sind = 0
    14. ''' </summary>
    15. ''' <param name="aktiv">Aktive Kosten als Integer</param>
    16. Public Sub New(ByVal aktiv As Integer)
    17. _Aktiv = aktiv
    18. _Inaktiv = 0
    19. End Sub
    20. ''' <summary>
    21. ''' Erstellt ein neues KostenObjekt
    22. ''' </summary>
    23. ''' <param name="aktiv">Aktive Kosten</param>
    24. ''' <param name="inaktiv">Inaktive Kosten</param>
    25. Public Sub New(ByVal aktiv As Integer, ByVal inaktiv As Integer)
    26. _Aktiv = aktiv
    27. _Inaktiv = inaktiv
    28. End Sub
    29. ''' <summary>
    30. ''' Legt die Aktive Kosten fest.
    31. ''' </summary>
    32. ''' <value>Setzt Aktive Kosten.</value>
    33. ''' <returns>Gibt aktuelle Aktive Kosten zurück.</returns>
    34. Public Property Aktiv() As Integer
    35. Get
    36. Return _Aktiv
    37. End Get
    38. Set(value As Integer)
    39. _Aktiv = value
    40. End Set
    41. End Property
    42. ''' <summary>
    43. ''' Legt die InAktiven Kosten fest
    44. ''' </summary>
    45. ''' <value>Setzt die Aktiven Kosten.</value>
    46. ''' <returns>Gibt aktuelle Inaktive Kosten zurück.</returns>
    47. Public Property InAktiv() As Integer
    48. Get
    49. Return _Inaktiv
    50. End Get
    51. Set(value As Integer)
    52. _Inaktiv = value
    53. End Set
    54. End Property
    55. End Class

    Wenn ich das jezt im propertyGrid einbinden will, wird es im Programm anschließend ausgegraut angezeigt, und ich kann nichts eingeben, und wenn ich im Konstruktor schon Daten eingebe wird mir dann anschließend nur gezeigt das dort ein Objekt vom Typ Kosten drinnen ist. Ich weiß jetzt nicht was ich noch alles verändern muss, damit es richtig angezeigt werden kann.

    Spoiler anzeigen
    Nachher soll das so da stehen: "10;0". Die erste Zahl für die Aktiven Kosten, und die Zweite für die Inaktiven


    VB.NET-Quellcode

    1. Private _bilanz As Kosten
    2. <Category("Kosten"), Description("Aktive und Inaktive Bilanzauswirkungen des Gebäudes"), DisplayName("Bilanzauswirkungen")> _
    3. Property Bilanz() As Kosten
    4. Get
    5. Return _bilanz
    6. End Get
    7. Set(value As Kosten)
    8. _bilanz = value
    9. End Set
    10. End Property
    „Ex-ter-mi-nate all knock-knock jokes! They are an enemy of the daleks “ A Dalek
    Mein Blog zum Thema Klarträumen
    So, hab das Tutorial an meine Bedingungen angepasst:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class KostenKonverter : Inherits ExpandableObjectConverter
    2. Public Overrides Function CanConvertTo(context As System.ComponentModel.ITypeDescriptorContext, destinationType As System.Type) As Boolean
    3. If (destinationType Is GetType(Kosten)) Then
    4. Return True
    5. End If
    6. Return MyBase.CanConvertTo(context, destinationType)
    7. End Function
    8. Public Overrides Function CanConvertFrom(context As System.ComponentModel.ITypeDescriptorContext, sourceType As System.Type) As Boolean
    9. If (sourceType Is GetType(String)) Then
    10. Return True
    11. End If
    12. Return MyBase.CanConvertFrom(context, sourceType)
    13. End Function
    14. Public Overrides Function ConvertFrom(context As System.ComponentModel.ITypeDescriptorContext, culture As System.Globalization.CultureInfo, value As Object) As Object
    15. If TypeOf value Is String Then
    16. Try
    17. Dim s As String = CType(value, String)
    18. Dim Kostenparts() As String
    19. Dim KostenString As String
    20. Kostenparts = Split(s, ";")
    21. If Not IsNothing(Kostenparts) Then
    22. Dim cost As Kosten = New Kosten
    23. If Not IsNothing(Kostenparts(0)) Then
    24. cost.Aktiv = Kostenparts(0)
    25. End If
    26. If Not IsNothing(Kostenparts(1)) Then
    27. cost.InAktiv = Kostenparts(1)
    28. Else
    29. cost.InAktiv = 0
    30. End If
    31. End If
    32. Catch ex As Exception
    33. Throw New ArgumentException(ex.ToString)
    34. End Try
    35. End If
    36. Return MyBase.ConvertFrom(context, culture, value)
    37. End Function
    38. Public Overrides Function ConvertTo(context As System.ComponentModel.ITypeDescriptorContext, culture As System.Globalization.CultureInfo, value As Object, destinationType As System.Type) As Object
    39. If (destinationType Is GetType(String)) AndAlso TypeOf value Is Kosten Then
    40. Dim Cost As Kosten = CType(value, Kosten)
    41. Return Cost.Aktiv & ";" & Cost.InAktiv
    42. End If
    43. Return MyBase.ConvertTo(context, culture, value, destinationType)
    44. End Function
    45. End Class


    VB.NET-Quellcode

    1. <TypeConverter(GetType(KostenKonverter)), Category("Kosten"), Description("Aktive und Inaktive Bilanzauswirkungen des Gebäudes"), DisplayName("Bilanzauswirkungen")> _
    2. Property Bilanz() As Kosten
    3. Get
    4. Return _bilanz
    5. End Get
    6. Set(value As Kosten)
    7. _bilanz = value
    8. End Set
    9. End Property



    Ein Plus zum anzeigen der anderen Eigenschaften taucht nicht auf. Und wenn ich zum Beispiel "0;0" eingebe kommt der Fehler: "KostenKonverter kann nicht von System.String konvertieren." Der taucht in der Function "ConvertFrom" auf, aber ich habe keine Ahnung wie ich den beheben könnte.
    „Ex-ter-mi-nate all knock-knock jokes! They are an enemy of the daleks “ A Dalek
    Mein Blog zum Thema Klarträumen
    Du musst wahrscheinlich den Operator überladen.
    Beispiel (muss in die Kosten-Klasse):

    VB.NET-Quellcode

    1. Public Shared Widening Operator CType(str As String) As Kosten
    2. Dim Splitted() = str.Split(";") ' bei ; trennen
    3. Return New Kosten(CInt(Splitted(0)), CInt(Splitted(1)))
    4. End Operator

    Damit können String-Objekte in Kosten umgewandelt werden.
    Kannst du auch so ausprobieren:

    VB.NET-Quellcode

    1. Dim Str = "12;13"
    2. Dim Kosten As Kosten = Str
    3. ' ...
    Tut mir leid, aber ich versteh jetzt leider garnicht was der Code macht(suche gerade in der msdn). Und Leider tritt der Fehler immernoch auf, wenn ich alles eingefügt habe.

    Ich hab jetzt noch mal genau überprüft wo der Fehler auftritt.
    Und zwar bei der Return anweisung in der Funktion ConvertFrom

    Edit: Habe jetzt mal die ganze Klassen "ConvertFrom" auskommentier. Der Fehler ist immernoch da. Ich such den jetztmal woanders.

    Edit²:
    Habe die Lösung gefunden. Ich habe die Variable "_bilanz" nicht richtig initialisiert. Ich habe "= new Kosten()" vergessen.

    VB.NET-Quellcode

    1. <Category("Kosten"), Description("Aktive und Inaktive Bilanzauswirkungen des Gebäudes"), DisplayName("Bilanzauswirkungen")> _
    2. Property Bilanz() As Kosten
    3. Get
    4. Return _bilanz
    5. End Get
    6. Set(value As Kosten)
    7. _bilanz = value
    8. End Set
    9. End Property
    „Ex-ter-mi-nate all knock-knock jokes! They are an enemy of the daleks “ A Dalek
    Mein Blog zum Thema Klarträumen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Pascal J.“ ()

    Habe mir gerade die ConvertFrom-Methode angesehen.
    Ich denke, du musst das

    VB.NET-Quellcode

    1. Return MyBase.ConvertFrom(context, culture, value)
    löschen und stattdessen das neue Kosten-Objekt zurückgeben.