0
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

4

3 に答える 3

2

にはBindingListこれらの変更をキャッチするイベントがありますが、INotifyPropertyChangedインターフェイスを実装するためにEquipmentクラスが必要になります。

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

イベントを処理する機器リストの各オブジェクトに、EquipmentCollectionのイベントハンドラーを追加する必要があります。

イベントとイベントハンドラに関するMSDNページを参照してください。 http://msdn.microsoft.com/en-us/library/2z7x8ys3%28v=vs.80%29.aspx

于 2012-09-27T17:37:25.343 に答える
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 に答える