Verweis in einer Klasse auf Elemente einer anderen Klasse

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

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

    Verweis in einer Klasse auf Elemente einer anderen Klasse

    Hallo,

    Ich habe 2 Klassen (gekürzt)

    VB.NET-Quellcode

    1. Public Class Person
    2. Private _Name As String
    3. Public Property Name As String
    4. Get
    5. Return _Name
    6. End Get
    7. Set(value As String)
    8. _Name = value
    9. End Set
    10. End Property
    11. End Class
    12. Public Class Organisation
    13. Private _Name As String
    14. Private _Personen As List(Of Person)
    15. Public Property Name As String
    16. Get
    17. Return _Name
    18. End Get
    19. Set(value As String)
    20. _Name = value
    21. End Set
    22. End Property
    23. Public Property Personen As List(Of Person)
    24. Get
    25. Return _Personen
    26. End Get
    27. Set(value As List(Of Person))
    28. _Personen = value
    29. End Set
    30. End Property
    31. End Class


    Diese werden in einer weiteren Klasse "zusammengefasst":

    VB.NET-Quellcode

    1. Public Class Region
    2. Private _Name As String
    3. Private _Personen As List(Of Person)
    4. Private _Organisationen As List(Of Organisation)
    5. Public Property Name As String
    6. Get
    7. Return _Name
    8. End Get
    9. Set(value As String)
    10. _Name = value
    11. End Set
    12. End Property
    13. Public Property Personen As List(Of Person)
    14. Get
    15. Return _Personen
    16. End Get
    17. Set(value As List(Of Person))
    18. _Personen = value
    19. End Set
    20. End Property
    21. Public Property Organisationen As List(Of Organisation)
    22. Get
    23. Return _Organisationen
    24. End Get
    25. Set(value As List(Of Organisation))
    26. _Organisationen = value
    27. End Set
    28. End Property
    29. End Class


    Es kann in einer "Region" also beliebig viele Organisationen und auch beliebig viele Personen geben. Gleichzeitig kann eine Organisation auch beliebig viele Personen beinhalten.
    Ein Objekt der Klasse "Region" kann ich problemlos an ein PropertyGrid binden und so den Inhalt bearbeiten. Soweit ist also alles gut.
    Mein Problem ist nun, dass ich gerne eine Liste mit Personen und eine Liste mit Organisationen hätte und ein Element in der Liste der Personen innerhalb einer Organisation ist lediglich ein Verweis auf ein Item in der Liste der Personen. Im Moment kann ich ja einfach eine Person innerhalb einer Organisation anlegen, die dann aber natürlich nicht in der Liste der Personen (innerhalb von Region) auftaucht.
    Das Ganze sollte natürlich immer noch mit einem PropertyGrid bearbeitet werden können. Gibt es dafür eine Lösung?

    Danke und schöne Grüße,
    Frank
    Willkommen im Forum.
    Ich kenne Deine Vorkenntnisse nicht, daher könnte folgende Behauptung als Affront gewertet werden: Dein Datenmodell ist falsch. Meiner Meinung nach. Denn wenn in einer Region mehrere Organisationen sind, in denen wiederum mehrere Personen sind, aber dann eben noch in einer Region mehrere Personen sind, dann sind das unterschiedliche Personenkreise. Nämlich organisationsgebundene und "freie" Personen. Dieselben Personen in 2 Klassen zu halten, wäre Datenredundanz. Selbst mit Verweisen ist das nicht so viel besser, denn die müsste man vermutlich mehr oder weniger intensiv pflegen. Da jede Organisation aber ihre Personen preisgeben kann, kannst Du so für jede Region an alle Personen kommen. Denn was würde es Dir bringen, eine Personenliste der Region zuzuordnen, wenn dann keine Organisation(en) für die neuen Personen feststeht/feststehen?
    Wenn es Dir jedoch (nur) darum geht, dass das PropertyGrid so läuft wie gewünscht, dann endet mein Wissen hier. Ich verwende (bisher) keine PropertyGrids.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Frank G. Willkommen im Forum. :thumbup:
    Schreib Deine Klassen so, das genügt:

    VB.NET-Quellcode

    1. Public Class Person
    2. Public Property Name As String
    3. End Class
    4. Public Class Organisation
    5. Public Property Name As String
    6. Public Property Personen As List(Of Person)
    7. End Class
    8. Public Class Region
    9. Public Property Name As String
    10. Public Property Personen As List(Of Person)
    11. Public Property Organisationen As List(Of Organisation)
    12. End Class
    Definiere:

    Frank G. schrieb:

    ein Verweis auf ein Item in der Liste

    Dies geht einmal über deren Index, das geht allerdings nur in einer Richtung, wenn sich das Listenelemengt ändert, zeigt der Index auf das geänderte Element.
    Andersherum nicht.
    Wenn Du mit Instanzen von Klassen arbeitest, geht das bidirektional, dann kannst Du von überall aus darauf zugreifen und Member ändern, sie sind dann auch überall geändert.
    Bearbeitung im PropertyGrid
    Meinst Du das zur Entwicklungszeit (im Designer)
    oder
    soll das zur Laufzeit geschehen, also im Sinne einern Datenbank?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wow, das ging ja flott, mit Antworten. :-o Schonmal Danke dafür und die Begrüßungen!

    @VaporiZed: Keine Sorge, ich sehe das nicht Affront. :) Ich behaupte auch nicht, dass mein Ansatz grundsätzlich richtig ist, nur weil er für meine Logik als plausibel erschien. ;)
    Was ich abbilden möchte, ist folgendes:
    In einer Region kann es Organisationen geben.
    In einer Region kann es Personen geben. Entscheidend ist der Punkt, dass eine Person entweder keiner, einer oder beliebig vielen Organisationen in einer Region angehören kann.
    Innerhalb einer Organisation hätte ich gerne eine Liste mit den Personen, die ihr angehören.

    @RodFromGermany: Mir geht es tatsächlich um das PropertyGrid zur Laufzeit. Das Beispiel war nur ein kleiner angepasster Ausschnitt für meine Problemstellung. Tatsächlich sind die Klassen noch etwas mehr und umfangreicher und werden über einen Serializer in XML gespeichert und geladen (also deren Inhalt).

    Ich hatte auch schon daran gedacht, innerhalb der Organisation-Klasse nur eine Liste mit Indizes auf Elemente in der "List(Of Person)" aus der Region zu verwalten.

    Innerhalb der Region würde es dann beispielsweise Organisation(0) und Organisation(1), sowie Person(0), Person(1) und Person(2) geben und innerhalb der Organisation(0) würde dann die Liste der Personen nur (1) (als Index für Person(1)) enthalten und in Organisation(1) hätte die Liste der Personen (0,1) (Indizies auf Person(0) und Person(1)).
    Damit das funktioniert müsste ich aber innerhalb der Klasse "Organisation" Zugriff auf die Elemente bzw. die Liste der Personen haben, damit ich im PropertyGrid die korrekten Indizes auswählen kann.

    Wie sähe der Ansatz mit den Instanzen denn aus? Ich gebe zu, Klassen sind da nicht unbedingt meine Stärke. ;)

    Schöne Grüße,
    Frank
    So kommst du nicht weiter.
    Du bist genau an dem Punkt, wo man den Schritt vom objektorientierten Datenmodell zum relationalen Datenmodell vollziehen muss.
    Gugge hier: Grundlagen: Relationale Datenmodellierung

    Dasselbe nochmal, auf englisch, und weiterführend bis in komplette Datenverarbeitungen:
    codeproject.com/Articles/10309…l-Datamodel-for-Beginners