Event aus untergestelltem Objekt behandeln

  • VB.NET

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

    Event aus untergestelltem Objekt behandeln

    Neu

    Hallo,
    ich habe aktuell das Problem, dass ich auf die Änderung eines Wertes in einer (Unter-)Klasse reagieren will. Mir fällt leider aktuell nur keine saubere Struktur, mit der ich das Problem lösen kann, ein. Bei der Verschachtelung der Klassen ist es leider mit einem Event nicht getan.

    Meine beiden Lösungsansätze wären die Datenstruktur zu ändern, aber die bekomme ich von außen per JSON und sie wird dann direkt in die Klassenstruktur umgesetzt. Des Weiteren kann ich mir noch eine Eventkette vorstellen, bei der ein Event ein anderes auslöst, bis ich an der gewünschten Position angekommen bin. Von den Ideen bin ich bisher noch nicht ganz überzeugt. Habt ihr einen besseren Ansatz?

    Habe meine Klassenstruktur mal stark vereinfacht dargestellt:

    VB.NET-Quellcode

    1. Class Hauptsammlung
    2. Dim WithEvents Daten As New Nebensammlung
    3. Sub ReaktionWert1() 'Soll auf Änderung von Wert1 reagieren
    4. End Sub
    5. End Class
    6. Public Class Nebensammlung
    7. Public Werte As New Wertesammlung 'davon gibt es 5-6 Stück im eigentlichen Programm
    8. End Class
    9. Public Class Wertesammlung
    10. Public Werte As New Wert 'davon etwa 7-8 Stück im eigentlichen Programm
    11. End Class
    12. Public Class Wert
    13. Private _Wert1 As Integer 'etwa 30 Werte im eigentlichen Programm
    14. Public Property Wert1 As Integer
    15. Get
    16. Wert1 = _Wert1
    17. End Get
    18. Set(value As Integer)
    19. If True Then
    20. _Wert1 = value 'Hier soll das Event aufgerufen werden
    21. End If
    22. End Set
    23. End Property
    24. End Class


    Liebe Grüße
    K4RTOFF3L
    Gruß K4RTOFF3L

    Das Problem zu erkennen ist wichtiger, als die Lösung zu erkennen, denn die genaue Darstellung des Problems führt zur Lösung. - Albert Einstein

    Neu

    Ein Event wird nicht aufgerufen, sondern abgefeuert/gesendet/"geraised". Ein EventHandler empfängt es. Da Du kein RaiseEvent im Property-Setter nutzt und auch keinen EventHandler formuliert hast, passiert auch nichts.

    <Eigenwerbung>
    Saubere(re) Strukturen und Trennung habe ich neulich hier mal angefangen, aufzulisten.
    WinForms Projektentwicklung bzgl. der Rolle des Formulars
    </Eigenwerbung>
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    Vielen Dank für deine Antwort. Das war mir bewusst, jedoch habe ich das Problem, dass ich höchstens eine Ebene weiter nach unten kann. Also Hauptsammlung kann nur auf Events von Nebensammlung zugreifen, aber nicht mehr auf Events von Wertesammlung und dies selbst wenn es bis auf die unterste Ebene hindurch als "WithEvents" gekennzeichnet ist. Sowas wie Sub ReaktionWert1() Handles Daten.Werte.Werte.testevent ist nicht möglich. Ich habe wohl ein bisschen zu viel gekürzt um den Raum für mehr Vorschläge zu erweitern.
    Gruß K4RTOFF3L

    Das Problem zu erkennen ist wichtiger, als die Lösung zu erkennen, denn die genaue Darstellung des Problems führt zur Lösung. - Albert Einstein

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

    Neu

    Du hast recht, dass das nicht geht. Du kannst aber schreiben:
    AddHandler Daten.Hauptstruktur.testevent, AddressOf DeineSub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    K4RTOFF3L schrieb:

    dass ich höchstens eine Ebene weiter nach unten kann.
    In diesem Falle musst Du das Event sich durchhangeln lassen bis dahin, wo es ankommen soll.
    Nutze dieselben EventArgs, dann musst Du in den betreffenden EventHandlern nur noch RaiseEvent aufrufen und feddich.
    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!

    Neu

    Ich würde als Event das PropertyChangedEvent von INotifyPropertyChanged empfehlen. Im von Vaporized verlinkten Tut habich da auch ein Sample gebastelt, wo das vorkommt.
    Vorteil wäre, du musst nur ein Event deklarieren, und nur einen Eventhandler schreiben.
    Im Eventhandler musste dann aber die Objekte und Properties auseinanderklamüsern, die das Event jeweils gefeuert haben.

    Eventuell - wenn du nicht viel mehr tun willst, als die Werte anzuzeigen - kannste ja auch Databinding benutzen. Dann brauchste nichtmal eine Eventhandler-Methode.

    Allerdings bin ich gespannt, ob die Funktion der Tutorial-Projekte verständlich genug dargestellt ist.
    Wir (Vaporized und ich) zeigen da nämlich nicht, wie wir mit dem Datenquellfenster ObjektDatenquellen generiert haben, um daran zu binden.

    Also wie immer: Bei Fragen nicht wegzappen, sondern fragen.