(Wir sind immer noch in Net-VB !!)
Eine recht einfache Möglichkeit, Wertveränderungen durch
Ereignisse zu überwachen, besteht in der Erweiterung der
generischen List(of T) (System.Collections.Generic).
Man beschattet die Standardeigenschaft "Item" (Wertzuweisungen)
und fügt die benötigten Ereignisse ein.
Im Beispiel meldet das Ereignis "ValueChanging", dass ein Wertwechsel
bei einem Item der Liste stattfinden soll und informiert über den
bisherigen und den neu einzutragenden Wert.
Bei der Ereignisverarbeitung kann der einzutragende Wert direkt
abgeändert werden.
Public Class ListEv(Of t)
Inherits System.Collections.Generic.List(Of t)
Private _SuspendEvents As Boolean = False
Public Event ValueChanging(ByVal Index As Integer, _
ByVal OldValue As t, ByRef NewValue As t)
Public Event Valuechanged(ByVal Index As Integer, ByVal newvalue As t)
Public Property Suspend_Events() As Boolean
Get
Return _suspendevents
End Get
Set(ByVal value As Boolean)
_suspendevents = value
End Set
End Property
Default Public Shadows Property item(ByVal index As Integer) As t
Get
Return MyBase.Item(index)
End Get
Set(ByVal value As t)
If Not _SuspendEvents Then
RaiseEvent ValueChanging(index, MyBase.Item(index), value)
End If
MyBase.Item(index) = value
If Not _SuspendEvents Then
RaiseEvent Valuechanged(index, MyBase.Item(index))
End If
End Set
End Property
End Class Um Wertwechsel zu überwachen, muss im Deklarationsteil des Formulars
eine Instanz der Klasse erstellt werden (im benötigten Datentyp):
Dim WithEvents myIntegers As New ListEv(Of Integer) Im Form_Load-Ereignis werden die benötigten Elemente der Liste
hinzugefügt (dabei kann ein Startwert zugewiesen werden).
Es werden noch keine Ereignisse ausgelöst.
For i As Integer = 0 To 9
myIntegers.Add(0)
Next i Versucht man nun, einen Wert auf eines der Elemente zuzuweisen,
wird das Changing-Ereignis ausgelöst:
MyIntegers(5) = 12 Die Verarbeitung des Ereignisses erfolgt wie gewohnt:
Private Sub myIntegers_ValueChanging(ByVal Index As Integer, _
ByVal OldValue As Integer, ByRef NewValue As Integer) _
Handles myIntegers.ValueChanging
Dim r As Microsoft.VisualBasic.MsgBoxResult
r = Microsoft.VisualBasic.MsgBox("Integer " & CStr(Index) & _
" soll geändert werden" & Microsoft.VisualBasic.vbCrLf & _
"von " & CStr(OldValue) & " zu " & CStr(NewValue), _
Microsoft.VisualBasic.MsgBoxStyle.OkCancel)
If r = Microsoft.VisualBasic.MsgBoxResult.Cancel Then
NewValue = OldValue
End If
End Sub Vor einer größeren Menge von Wertänderungen kann man die
Ereignisse vorübergehend abschalten:
myIntegers.Suspend_Events = True
For i As Integer = 0 To 1000
myIntegers(1) += i
Next i
myIntegers.Suspend_Events = False
Beitrag wurde zuletzt am 28.12.09 um 08:38:28 editiert. |