Public Class EquipmentCollection
{
Public Property EquipmentList As List(Of Equipment)
}
Public Class Equipment
{
Public Event CalculateFired
Public Sub Calculate
RaiseEvent CalculateFired
End Sub
}
如何处理设备集合类中设备类上的计算触发事件?
.NET 3.5, VB
BindingList
具有捕获这些更改的事件,但它需要您的设备类实现 INotifyPropertyChanged 接口:
Public Class Equipment
Implements INotifyPropertyChanged
Public Event PropertyChanged(ByVal sender As Object, _
ByVal e As PropertyChangedEventArgs) _
Implements INotifyPropertyChanged.PropertyChanged
Private _Calculation As Decimal
Public Sub Calculate(ByVal newNumber As Decimal)
Me.Calculation = newNumber
End Sub
Property Calculation() As Decimal
Get
Return _Calculation
End Get
Set(ByVal value As Decimal)
If value <> _Calculation Then
_Calculation = value
RaiseEvent PropertyChanged(Me, _
New PropertyChangedEventArgs("Calculation"))
End If
End Set
End Property
End Class
设备收集类将侦听更改的事件:
Public Class EquipmentCollection
Private WithEvents _EquipmentList As New BindingList(Of Equipment)
Public ReadOnly Property EquipmentList() As BindingList(Of Equipment)
Get
Return _EquipmentList
End Get
End Property
Private Sub EquipmentList_ListChanged(ByVal sender As Object, _
ByVal e As ListChangedEventArgs) _
Handles _EquipmentList.ListChanged
If e.ListChangedType = ListChangedType.ItemChanged Then
If e.PropertyDescriptor IsNot Nothing AndAlso _
e.PropertyDescriptor.Name = "Calculation" Then
MessageBox.Show("New Calculation = " & _
_EquipmentList.Item(e.NewIndex).Calculation.ToString)
End If
End If
End Sub
End Class
实现简单:
Dim ec As New EquipmentCollection
ec.EquipmentList.Add(New Equipment)
ec.EquipmentList.Add(New Equipment)
ec.EquipmentList.Last.Calculate(110.5)
这对
我有用。
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim ec As New EquipmentCollection
Dim eq As New Equipment
Dim el As New List(Of Equipment)
eq = New Equipment
el.Add(eq)
eq = New Equipment
el.Add(eq)
eq = New Equipment
el.Add(eq)
eq = New Equipment
el.Add(eq)
eq = New Equipment
el.Add(eq)
eq = New Equipment
el.Add(eq)
eq = New Equipment
el.Add(eq)
ec.EquipmentList = el
ec.EquipmentList.Item(2).Calculate()
End Sub
End Class
Public Class EquipmentCollection
Private WithEvents _EquipmentList As New List(Of Equipment)
Public Property EquipmentList As List(Of Equipment)
Get
Return _EquipmentList
End Get
Set(value As List(Of Equipment))
Dim counter As Integer
_EquipmentList = value
For counter = 0 To _EquipmentList.Count - 1
AddHandler _EquipmentList.Item(counter).CalculateFired, AddressOf HandleCalculateFired
Next
End Set
End Property
Private Sub HandleCalculateFired()
MsgBox("calc was fired")
End Sub
End Class
Public Class Equipment
Public Event CalculateFired()
Public Sub Calculate()
RaiseEvent CalculateFired()
End Sub
End Class
您需要在 EquipmentCollection 中将事件处理程序添加到设备列表中的要为其处理事件的每个对象。
请参阅 MSDN 有关事件和事件处理程序的页面。http://msdn.microsoft.com/en-us/library/2z7x8ys3%28v=vs.80%29.aspx