Benutzer mit den meisten Antworten
Events von Objekten in einer ArrayList

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.
Vielen Dank im VorausPublic 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
Christian Tauschek
Christian Tauschek- Typ geändert Christian Tauschek Samstag, 18. Dezember 2010 18:30
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- Als Antwort markiert Christian Tauschek Sonntag, 19. Dezember 2010 15:56
-
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- Als Antwort markiert Christian Tauschek Sonntag, 19. Dezember 2010 15:56
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- Als Antwort markiert Christian Tauschek Sonntag, 19. Dezember 2010 15:56
-
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)
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 -
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- Als Antwort markiert Christian Tauschek Sonntag, 19. Dezember 2010 15:56