0
Public Class EquipmentCollection
{
Public Property EquipmentList As List(Of Equipment)
}

Public Class Equipment
{
 Public Event CalculateFired

 Public Sub Calculate
  RaiseEvent CalculateFired
 End Sub
}

How can I handle the CalculateFired event on the Equipment class within the EquipmentCollection class?

.NET 3.5, VB

4

3 回答 3

2

BindingList事件来捕获这些更改,但它需要您的 Equipment 类来实现 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

您的 EquipmentCollection 类将侦听更改的事件:

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)
于 2012-09-27T18:13:26.733 回答
0

这对我有用。

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
于 2012-09-27T17:46:30.577 回答
0

您需要在 EquipmentCollection 中为您要为其处理事件的设备列表中的每个对象添加一个事件处理程序。

请参阅有关事件和事件处理程序的 MSDN 页面。 http://msdn.microsoft.com/en-us/library/2z7x8ys3%28v=vs.80%29.aspx

于 2012-09-27T17:37:25.343 回答