Umstieg VB6 auf .net, Events aus Collections auslösen

16/10/2009 - 13:22 von Jens Schröder | Report spam
Hallo allerseits,

nach etlichen Jahren des Nichtprogrammierens wurde ich wieder aus dem
Keller geholt, um meine in VB6 geschriebenen Programme nach .net zu
konvertieren. Zu meinen damaligen Problemen zàhlte das Auslösen und
Abarbeiten von Events von Objecten die sich in Collections befanden.

Meine Lösung damals bestand darin, das Eltern-, bzw. Collectionobject
beim Anlegen des Objectes mit anzugeben. Das führt dann aber
unweigerlich zu Zirkelbezügen.

Meine Frage diesbezüglich:

Gibt es mittlerweile Möglichkeiten solche Events auszulösen und
abzuarbeiten?

Hier ein Beispiel zur besseren Verdeutlichung meine damaligen Baumstruktur:



Public Class clsTest
Public Event KeyChange(ByVal Oldkey As String, ByVal Newkey As String)

Private _Key As String

Public Property Key() As String
Get
Return _Key
End Get
Set(ByVal value As String)
RaiseEvent KeyChange(_Key, value)
_Key = value
End Set
End Property

Private _TestListe As New Dictionary(Of clsTest, String)

Public ReadOnly Property TestListe() As Dictionary(Of clsTest, String)
Get
Return _TestListe
End Get
End Property

Private Sub KeyChangeHandler(ByVal Oldkey As String, ByVal Newkey
As String) ' Handles TestListeEvents

' Hier soll dann das Object mit dem neuen Key zur List
hinzugefügt und das mit dem alten Key gelöscht werden

End Sub

End Class



Wàre eine solche Konstruktion möglich? Und wenn ja, wie?

Vielen Dank für die Mühe
Jens Schröder

PS.: Mir steht vorraussichtlich nur Visual Studio 2005 zur Verfügung.
 

Lesen sie die antworten

#1 Armin Zingler
16/10/2009 - 16:11 | Warnen spam
Jens Schröder schrieb:
Hallo allerseits,

nach etlichen Jahren des Nichtprogrammierens wurde ich wieder aus dem
Keller geholt, um meine in VB6 geschriebenen Programme nach .net zu
konvertieren. Zu meinen damaligen Problemen zàhlte das Auslösen und
Abarbeiten von Events von Objecten die sich in Collections befanden.



Duch die Addhandler-Anweisung ist das heutzutage wesentlich unproblematischer.

Meine Lösung damals bestand darin, das Eltern-, bzw. Collectionobject
beim Anlegen des Objectes mit anzugeben. Das führt dann aber
unweigerlich zu Zirkelbezügen.

Meine Frage diesbezüglich:

Gibt es mittlerweile Möglichkeiten solche Events auszulösen und
abzuarbeiten?

Hier ein Beispiel zur besseren Verdeutlichung meine damaligen Baumstruktur:



Public Class clsTest
Public Event KeyChange(ByVal Oldkey As String, ByVal Newkey As String)

Private _Key As String

Public Property Key() As String
Get
Return _Key
End Get
Set(ByVal value As String)
RaiseEvent KeyChange(_Key, value)
_Key = value
End Set
End Property

Private _TestListe As New Dictionary(Of clsTest, String)

Public ReadOnly Property TestListe() As Dictionary(Of clsTest, String)
Get
Return _TestListe
End Get
End Property

Private Sub KeyChangeHandler(ByVal Oldkey As String, ByVal Newkey
As String) ' Handles TestListeEvents

' Hier soll dann das Object mit dem neuen Key zur List
hinzugefügt und das mit dem alten Key gelöscht werden

End Sub

End Class



Wàre eine solche Konstruktion möglich? Und wenn ja, wie?



Bei dem Beispiel verstehe ich den Sinn nicht. Kapselt clsTest eine Liste oder ist
sie ein Eintrag innerhalb der Liste?


Also im allgemeinen sieht die Lösung so aus, dass du per AddHandler-Anweisung die Ereignisse
jedes Elements empfangen kannst, und zwar unabhàngig davon, ab sie in einer Liste stehen
oder nicht. Du könntest also Addhandler für jedes Element ausführen, das du zur Liste
hinzufügst.

Alternativ, falls die Liste ein "ItemAdded"-Event (o.à.) hat, dann kannst du dieses
Ereignis behandeln und Addhandler für das hinzugefügte Element ausführen.

Oder, mangels eines solchen Events, kannst du von der Liste erben und immer
beim Hinzufügen eines Items ein eigenes Event auslösen.

Falls das auch nicht möglich ist, kannst du eine eigene Liste schreiben, die intern
auf in deinem Fall das Dictionary verweist, alle Methodenaufrufe spiegelt und
an das Dictionary weitergibt. Dadurch kannst du beim Add ebenfalls ein Ereignis
auslösen.

So. Ich plàdiere aber nachdrücklich für Variante 1. Schließlich weißt du ja i.d.R. was du hinzufügst
und kennst jedes Objekt, dessen Ereignisse du behandeln willst. Du bist nicht mehr
auf zur Entwurfszeit festgelegte WithEvents-Variablen angewiesen sondern kannst das flexibel
handhaben.


...wobei ich jetzt erst das kleine Wörtchen "Baumstruktur" entdecke. Habe den Sinn
der Klasse doch noch verstanden. :-/ Nun, das macht es nicht einfacher. Wenn du aber
Variante 1 verwenden kannst, dann brauche ich mir jetzt vorerst mal keenen Kopp machen. ;)


PS.: Mir steht vorraussichtlich nur Visual Studio 2005 zur Verfügung.



Macht nichts, bereits VB 2002 war ein Quantensprung. ;-) SCNR


Armin

Ähnliche fragen