【问题标题】:Visual Basic - Handle events for class within a listVisual Basic - 处理列表中的类事件
【发布时间】:2012-09-27 17:17:52
【问题描述】:
Public Class EquipmentCollection
{
Public Property EquipmentList As List(Of Equipment)
}

Public Class Equipment
{
 Public Event CalculateFired

 Public Sub Calculate
  RaiseEvent CalculateFired
 End Sub
}

如何处理 EquipmentCollection 类中 Equipment 类的 CalculateFired 事件?

.NET 3.5,VB

【问题讨论】:

  • 为什么您发布的代码是 c# 和 vb 的混合体?

标签: vb.net event-handling


【解决方案1】:

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)

【讨论】:

    【解决方案2】:

    这对我有用。

    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
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-20
        • 2014-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多