none
Events von Objekten in einer ArrayList RRS feed

  • Frage

  • Hallo Leute,
    ich habe eine Klasse, in der sich eine ArrayList mit gleichen Objekten befindet.
    Nun kann aber auch jedes dieser Objekte in der ArrayList ein Event feuern. Wie kann ich dieses Event innerhalb der Klasse behandeln.

      Public Class cMeineKlasse
        Private MeineObjekte As ArrayList
    
        Private Sub Handle_Ein_Gemeinsames_Event_Von_Meine_Objekte(ByVal sender As Object, ByVal e As EventArgs)
          'hierher soll gesprungen werden, wenn ein Objekt in der ArrayList ein Event feuert
          'Event-Signatur und der Objekttyp sind selbstverständlich gleich für alle Objekte in der ArrayList
        End Sub
    
      End Class
    
    
    Vielen Dank im Voraus
    Christian Tauschek

    Christian Tauschek
    Samstag, 18. Dezember 2010 18:29

Antworten

  • Hallo Christian,

    ich habe eine Klasse, in der sich eine ArrayList mit gleichen Objekten befindet.
    Nun kann aber auch jedes dieser Objekte in der ArrayList ein Event feuern. Wie kann ich dieses Event innerhalb der Klasse behandeln.

    Du kannst mittels AddHandler dynamisch einen Ereignisempfänger einem Ereignis hinzufügen. In etwa:

      Dim lEventObj As New Object()
    
      AddHandler lEventObj.EventVonObjekt, AddressOf Handle_Ein_Gemeinsames_Event_Von_Meine_Objekte
      MeineObjekte.Add(lEventObj)
    

    RemoveHandler entfernt den Ereignisempfänger dann wieder.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Samstag, 18. Dezember 2010 20:31
    Moderator
  • hallo Christian,

    entweder du stellst es um auf eine ObervableCollection

    http://msdn.microsoft.com/de-de/library/ms668604.aspx

    dann kann die Liste weiterhin Public sein. Im Sinne sauberer Kapselung würde ich dir aber empfehlen, die Liste selbst private zu machen und mit entsprechenden Zugriffsmethoden zu versehen.

    Im Besonderen ist dein Setter eine ziemlich schmutzige Geschichte. Jeder kann von aussen die ganze Liste durch eine andere ersetzen ohne das du was merkst. Ist das im Sinne des Erfinders?

    Ungefähr so:

    Public Class cMeineKlasse
      Private _MeineObjekte As ArrayList = Nothing
      Private Sub CommonEvent(ByVal sender As Object, ByVal e As EventArgs)
      End Sub
      Public ReadOnly Property MeineObjekte() As ArrayList
          Get
              If _MeineObjekte Is Nothing Then
                  _MeineObjekte = New ArrayList()
              End If
              Return _MeineObjekte.Clone();
          End Get
      End Property
      Public WriteOnly Property MeineObjekteAdd(ByRef AObject As Object)
          Set(ByVal value)
              If Not AObject Is Nothing Then
                  If _MeineObjekte Is Nothing Then
                      _MeineObjekte = New ArrayList()
                  End If
                  AddHandler AObject.EventVonObjekt, AddressOf CommonEvent
                  _MeineObjekte.Add(AObject)
              End If
          End Set
      End Property
    End Class

    Wobei mir nicht klar ist, was der Zusatz

    Event-Signatur und der Objekttyp sind selbstverständlich gleich für alle Objekte in der ArrayList

    bedeutet. Warum benutzt keine starke Typisierung mit einer List(Of T) bzw. ObservableCollection(Of T)?


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Sonntag, 19. Dezember 2010 13:40

Alle Antworten

  • Hallo Christian,

    ich habe eine Klasse, in der sich eine ArrayList mit gleichen Objekten befindet.
    Nun kann aber auch jedes dieser Objekte in der ArrayList ein Event feuern. Wie kann ich dieses Event innerhalb der Klasse behandeln.

    Du kannst mittels AddHandler dynamisch einen Ereignisempfänger einem Ereignis hinzufügen. In etwa:

      Dim lEventObj As New Object()
    
      AddHandler lEventObj.EventVonObjekt, AddressOf Handle_Ein_Gemeinsames_Event_Von_Meine_Objekte
      MeineObjekte.Add(lEventObj)
    

    RemoveHandler entfernt den Ereignisempfänger dann wieder.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Samstag, 18. Dezember 2010 20:31
    Moderator
  • Hallo Thorsten,
    ja ich kann das mit AddHandler machen. Aber in der ArrayList "MeineObjekte" werden zur Laufzeit ständig Objekte außerhalb von "cMeineKlasse" hinzugefügt und wieder entfernt.
    Fälschlicherweise habe ich in meinem obigen Posting "MeineObjekte" als Private deklariert. In meinem Programm ist es aber so, dass "MeineObjekte" öffentlich sind.

    Public Class cMeineKlasse
     Private _MeineObjekte As ArrayList
    
     Private Sub Handle_Ein_Gemeinsames_Event_Von_Meine_Objekte(ByVal sender As Object, ByVal e As EventArgs)
      'hierher soll gesprungen werden, wenn ein Objekt in der ArrayList ein Event feuert
      'Event-Signatur und der Objekttyp sind selbstverständlich gleich für alle Objekte in der ArrayList
     End Sub
    
     Public Property MeineObjekte() As ArrayList
      Get
       Return _MeineObjekte
      End Get
      Set(ByVal value As ArrayList)
       _MeineObjekte = value
      End Set
     End Property
    
    End Class
    

    In der Klasse"cMeineKlasse" bekomme ich aber nicht mit, wenn ein neues Objekt in der ArrayList hinzugefügt wurde.

    Dim MK As New cMeineKlasse
    MK.MeineObjekte.Add(New Control)
    
    
    Die Klasse Control besitzt aber bereits Events von denen eines davon in der Sub "Handle_Ein_Gemeinsames_Event_Von_Meine_Objekte" innerhalb von "cMeineKlasse" behandeln möchte.

    Oder muss ich den Weg so gehen, dass ich mir in "cMeineKlasse" eine eigene Sub zum Hinzufügen eines Controls einbauen muss:
     Private Sub AddControl(ByVal C As Control)
      AddHandler C.IrgendeinEvent, AddressOf Handle_Ein_Gemeinsames_Event_Von_Meine_Objekte
      Me.MeineObjekte.Add(C)
     End Sub
    
    

    mfg
    Christian Tauschek


    Christian Tauschek
    Sonntag, 19. Dezember 2010 10:34
  • hallo Christian,

    entweder du stellst es um auf eine ObervableCollection

    http://msdn.microsoft.com/de-de/library/ms668604.aspx

    dann kann die Liste weiterhin Public sein. Im Sinne sauberer Kapselung würde ich dir aber empfehlen, die Liste selbst private zu machen und mit entsprechenden Zugriffsmethoden zu versehen.

    Im Besonderen ist dein Setter eine ziemlich schmutzige Geschichte. Jeder kann von aussen die ganze Liste durch eine andere ersetzen ohne das du was merkst. Ist das im Sinne des Erfinders?

    Ungefähr so:

    Public Class cMeineKlasse
      Private _MeineObjekte As ArrayList = Nothing
      Private Sub CommonEvent(ByVal sender As Object, ByVal e As EventArgs)
      End Sub
      Public ReadOnly Property MeineObjekte() As ArrayList
          Get
              If _MeineObjekte Is Nothing Then
                  _MeineObjekte = New ArrayList()
              End If
              Return _MeineObjekte.Clone();
          End Get
      End Property
      Public WriteOnly Property MeineObjekteAdd(ByRef AObject As Object)
          Set(ByVal value)
              If Not AObject Is Nothing Then
                  If _MeineObjekte Is Nothing Then
                      _MeineObjekte = New ArrayList()
                  End If
                  AddHandler AObject.EventVonObjekt, AddressOf CommonEvent
                  _MeineObjekte.Add(AObject)
              End If
          End Set
      End Property
    End Class

    Wobei mir nicht klar ist, was der Zusatz

    Event-Signatur und der Objekttyp sind selbstverständlich gleich für alle Objekte in der ArrayList

    bedeutet. Warum benutzt keine starke Typisierung mit einer List(Of T) bzw. ObservableCollection(Of T)?


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Sonntag, 19. Dezember 2010 13:40