views:

42

answers:

1

I have an object of type SomeObject, with an event StatusChanged.

I have a property in SomeObject of type Status also with an event StatusChanged.

Within a private function in SomeObject, I would like to run some logic (including firing the StatusChanged event) in the event that Status has fired its StatusChanged event. I have been away from events for a while so it's a bit cloudy to me. How do I do this?

I'm writing in ASP.NET/VB.NET

Thanks :)

EDIT Ok, in the event that I can't do the above, how would I get the outer object (SomeObject) to fire its StatusChanged event when the inner object (Status) fires its StatusChanged event?

+1  A: 

Events don't work that way. You can't perform logic based on whether an event has been fired. You can only write logic that takes place when an event is fired.


Ok, here's an attempt. It's been a while since I've done this in VB.NET, though:

Public Enum CurrentStatus
    Good
    Bad
End Enum

Public Class StatusEventArgs
    Inherits EventArgs
    Private _currentStatus As CurrentStatus

    Public Property CurrentStatus() As CurrentStatus
        Get
            Return _currentStatus
        End Get
        Set(ByVal value As CurrentStatus)
            _currentStatus = value
        End Set
    End Property
End Class

Public Class StatusClass
    Public Event StatusChanged As EventHandler(Of StatusEventArgs)

    Protected Overridable Sub OnStatusChanged(ByVal newStatus As CurrentStatus)
        Dim s As New StatusEventArgs()
        s.CurrentStatus = newStatus
        RaiseEvent StatusChanged(Me, s)
    End Sub
End Class

Public Class SomeClass
    Private _status As StatusClass
    Public Event StatusChanged As EventHandler(Of StatusEventArgs)

    Protected Overridable Sub OnStatusChanged(ByVal newStatus As CurrentStatus)
        Dim s As New StatusEventArgs()
        s.CurrentStatus = newStatus
        RaiseEvent StatusChanged(Me, s)
    End Sub

    Public Property Status() As StatusClass
        Get
            Return _status
        End Get
        Set(ByVal value As StatusClass)
            If Not _status Is Nothing Then
                RemoveHandler _status.StatusChanged, AddressOf StatusHandler
            End If

            _status = value

            If Not _status Is Nothing Then
                AddHandler _status.StatusChanged, AddressOf StatusHandler
            End If
        End Set
    End Property

    Private Sub StatusHandler(ByVal sender As Object, ByVal e As StatusEventArgs)
        OnStatusChanged(e.CurrentStatus)
    End Sub
End Class
John Saunders
bah. i suck at events. i was afraid of this answer.
Jason
ok then, how do i get the outer object to fire its `StatusChanged` event when the inner object's `StatusChanged` event is fired?
Jason