Visual BasiC语言 处理列表中类的事件


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

相关内容

  • 没有找到相关文章

最新更新