2 Probleme mit List(Of Color)

  • VB.NET

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

    2 Probleme mit List(Of Color)

    Liebe Community,

    ich habe mir nur so zum Spaß mal ein Farb-Paletten-Control erstellt. Die Farbpalette wird dabei als List(Of Color) verwaltet.
    Nun habe ich damit allerdings 2 Probleme, die zu lösen ihr mir sicherlich helfen könnt:

    1. Die Liste ist über eine Property zugänglich. So weit so gut, ich möchte, wie gewöhnlich, mitkriegen, wann sie die Palette ändert. Nun wird aber der Setter nur aufgerufen, wenn der Property eine neue Liste zugewiesen wird, nicht jedoch, wenn eine der oft genutzen Methoden von List benutzt werden (Add, AddRange, Remove, etc...)
    Meine Idee war nun, winfach noch im Getter auf Änderung zu prüfen, aber das ist natürlich Käse, da ja eine Referenz übergeben wurde, die jederzeit Zugriff auf die Liste ermöglicht. Gibt es dafür eine suabere Lösung (ausser sich eine eigene Collection zu erstellen)?

    2. Wenn ich nun das erwähnte Palettencontrol im UserControlTestContainer teste, funktioniert alles wie gewohnt: Ich kann die Palette wie gewünscht ändern, alles klappt ohne Probleme.
    Wenn ich jetzt die DLL unverändert in ein vorhandenes Projekt einbinde und ein Palettencontrol erstelle, passiert auch nichts. Auch beim Ändern der Palette im Designer nicht. Erst beim erstellen gibt es einen Fehler:

    Spoiler anzeigen
    Fehler 1 Es konnte kein Typ für einen Namen gefunden werden. Der Typname war System.Collections.Generic.List`1[[System.Drawing.Color, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089. Zeile 151, Position 5. C:\Users\Anton\Documents\Visual Studio 2010\Projects\Paint\Paint\Form1.resx 151 5 Paint


    Ich habe mir daraufhin erstmal die "Form1.Designer.vb" angeschaut und habe, zu meiner Verwunderung, gesehen, dass die Liste nicht, wie erwartet, hardgecoded war, sondern nur aus einer Ressource geladen wurde. Also hab ich mir die Form1.resx (dort ist auch der Fehler aufgetreten/ gemeldet worden)
    angesehen:

    Spoiler anzeigen
    <data name="ColorPalette1.palette" mimetype="application/x-microsoft.net.object.binary.base64">
    <value>
    AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
    dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EEAQAAAIwBU3lzdGVtLkNv
    bGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uRHJhd2luZy5Db2xvciwgU3lzdGVtLkRyYXdp
    bmcsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3
    ZjExZDUwYTNhXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAABZTeXN0ZW0uRHJhd2luZy5Db2xv
    cltdAgAAAAgICQMAAAAUAAAAFAAAAAcDAAAAAAEAAAAgAAAABBRTeXN0ZW0uRHJhd2luZy5Db2xvcgIA
    AAAF/P///xRTeXN0ZW0uRHJhd2luZy5Db2xvcgQAAAAEbmFtZQV2YWx1ZQprbm93bkNvbG9yBXN0YXRl
    AQAAAAkHBwIAAAAKAAAAAAAAAAAjAAEAAfv////8////CgAAAAAAAAAATgABAAH6/////P///woAAAAA
    AAAAAF8AAQAB+f////z///8KAAAAAAAAAACkAAEAAfj////8////CgAAAAAAAAAAOwABAAH3/////P//
    /woAAAAAAAAAACcAAQAB9v////z///8KAAAAAAAAAACNAAEAAfX////8////CgAAAAAAAAAAiQABAAH0
    /////P///woAAAAAAAAAAH8AAQAB8/////z///8KAAAAAAAAAABMAAEAAfL////8////CgAAAAAAAAAA
    pgABAAHx/////P///wqA////AAAAAAAAAgAB8P////z///8KAAAAAAAAAABPAAEAAe/////8////CgAA
    AAAAAAAApwABAAHu/////P///woAAAAAAAAAAKEAAQAB7f////z///8KAAAAAAAAAACEAAEAAez////8
    ////CgAAAAAAAAAAJQABAAHr/////P///woAAAAAAAAAAJwAAQAB6v////z///8KAAAAAAAAAAAmAAEA
    Aen////8////Cue/yP8AAAAAAAACAAHo/////P///woAAAAAAAAAAAAAAAAB5/////z///8KAAAAAAAA
    AAAAAAAAAeb////8////CgAAAAAAAAAAAAAAAAHl/////P///woAAAAAAAAAAAAAAAAB5P////z///8K
    AAAAAAAAAAAAAAAAAeP////8////CgAAAAAAAAAAAAAAAAHi/////P///woAAAAAAAAAAAAAAAAB4f//
    //z///8KAAAAAAAAAAAAAAAAAeD////8////CgAAAAAAAAAAAAAAAAHf/////P///woAAAAAAAAAAAAA
    AAAB3v////z///8KAAAAAAAAAAAAAAAAAd3////8////CgAAAAAAAAAAAAAAAAs=
    </value>
    </data>

    Das ist der Abschnitt, der die Palette darstellt.
    Jetzt ist die Frage: Wo leigt der Fehler? WArum ist die Palette nicht einfach hardgecoded/ ist das immer so?

    Ich hoffe, ihr könnt mir meine beiden Fragen beantworten :)
    Danke schon im Vorraus,
    mfG,
    Hermann
    Zu Problem 2) ...versuche das einmal anzugeben (Zeile 4)

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Drawing.Design
    3. ...
    4. <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
    5. Public Property XXX() As List(Of Color)
    6. ...

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

    Hey,

    ein Beispiel, wie Du Änderungen an Deiner Liste mitkriegst. Ne andere Lösung ist mir nicht bekannt.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class EventList(Of T)
    2. Private _elementHolder As New List(Of T)
    3. Public Property elementList As List(Of T)
    4. Get
    5. Return _elementHolder
    6. End Get
    7. Set(value As List(Of T))
    8. _elementHolder = value
    9. End Set
    10. End Property
    11. Public Event ItemCountChanged(ByVal newItemCount As Integer)
    12. Public Sub Add(ByVal element As T)
    13. _elementHolder.Add(element)
    14. OnItemCountChanged()
    15. End Sub
    16. Public Sub AddRange(ByVal elements As IEnumerable(Of T))
    17. _elementHolder.AddRange(elements)
    18. OnItemCountChanged()
    19. End Sub
    20. Public Sub Remove(ByVal element As T)
    21. _elementHolder.Remove(element)
    22. OnItemCountChanged()
    23. End Sub
    24. Public Sub RemoveRange(ByVal index As Integer, ByVal count As Integer)
    25. _elementHolder.RemoveRange(index, count)
    26. OnItemCountChanged()
    27. End Sub
    28. Public Sub RemoveAll(ByVal match As Predicate(Of T))
    29. _elementHolder.RemoveAll(match)
    30. OnItemCountChanged()
    31. End Sub
    32. Public Sub Clear()
    33. _elementHolder.Clear()
    34. OnItemCountChanged()
    35. End Sub
    36. Private Sub OnItemCountChanged()
    37. RaiseEvent ItemCountChanged(_elementHolder.Count)
    38. End Sub
    39. End Class

    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    erstmal: vielen dank an euch beide!
    @ VB1963 danke für deine Bemühungen, aber das Ergebnis ist leider das Gleiche: beim Erstellen gibts den Fehler :(
    @ SpaceyX ja sowas hatte ich befürchtet. Ich habe gehofft, dass es auch ohne geht aber naja... was soll man machen Edit: Danke für die Bemühung, aber ich werde wohl lieber diese ObservableCollection nehmen :)
    @ Rinecamo: Danke dir, hast mir sehr geholfen :P :thumbsup:
    Edit 2: Für alle dies interessiert: Die ObservableCollection ist erst ab Frameworkversion 3.0 dabei (für die die, sie ich, nicht sofort drauf kommen :) )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Hermann“ () aus folgendem Grund: Man kann das Grün der alten Editierfarbe sehr schlecht lesen :)

    Du warte mal, evtl. hab ich ne elegantere Lösung....

    Hier, etwas eleganter, als Aleitung von List(Of T)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class EventList(Of T) : Inherits List(Of T)
    2. Public Event ItemCountChanged(ByVal newIndex As Integer)
    3. Public Shadows Sub Add(ByVal item As T)
    4. MyBase.Add(item)
    5. OnItemCountChanged()
    6. End Sub
    7. Public Shadows Sub AddRange(ByVal item As IEnumerable(Of T))
    8. MyBase.AddRange(item)
    9. OnItemCountChanged()
    10. End Sub
    11. Public Shadows Sub Remove(ByVal item As T)
    12. MyBase.Remove(item)
    13. OnItemCountChanged()
    14. End Sub
    15. Public Shadows Sub RemoveRange(ByVal index As Integer, ByVal count As Integer)
    16. MyBase.RemoveRange(index, count)
    17. OnItemCountChanged()
    18. End Sub
    19. Public Shadows Sub RemoveAll(ByVal match As Predicate(Of T))
    20. MyBase.RemoveAll(match)
    21. OnItemCountChanged()
    22. End Sub
    23. Public Shadows Sub RemoveAt(ByVal index As Integer)
    24. MyBase.RemoveAt(index)
    25. OnItemCountChanged()
    26. End Sub
    27. Public Shadows Sub Clear()
    28. MyBase.Clear()
    29. OnItemCountChanged()
    30. End Sub
    31. Protected Sub OnItemCountChanged()
    32. RaiseEvent ItemCountChanged(MyBase.Count)
    33. End Sub
    34. End Class



    Oh, ObservableCollection kannte ich gar nicht. Gut zu wissen. Na dann, eleganter als das bekommst es ohnehin nicht... Danke!!!!
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

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

    danke SpaceyX, aber ich werde trotzdem die ObservableCollection aus dem Framework benutzen. Denn warum das Rad neu erfinden?
    Edit: Da hab ich mich wohl zu früh gefreut :( Bei mir gibts die nicht. Hatte erst Framework 2.0 (weils halt ne DLL ist die nicht mehr brauchte und sie möglichst breit kompatibel sein sollte) jetzt hab ich aber auf Framework 3.0 und dann sogar zu 3.5 hochgestuft, aber die ObservableCollection gibt es bei mir einfach nicht (Laut msdn kam die in framework version 3.0 Hoffe ihr könnt mir nochmal helfen!

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