我正在创建一个程序,其中我有一个公开定义的布尔值
Public boolOverallStatus As Boolean = True
我需要在布尔值改变时执行一些代码。在以前的应用程序中,实际的表单项更改处理了这个,但它可以由几个不同的子进行更改。
我该如何处理?我正在浏览msdn,但它相当令人困惑。 简而言之:如何在发生布尔值更改事件时执行代码。
答案 0 :(得分:6)
改为将其作为财产。
Private _boolOverallStatus As Boolean = True
Property boolOverallStatus As Boolean
Get
Return _boolOverallStatus
End Get
Set(ByVal value as Boolean)
If value <> _boolOverallStatus Then
_boolOverallStatus = value
'// handle more code changes here.'
End If
End Set
End Property
答案 1 :(得分:3)
我使用以下模式,类似于Microsoft为其大多数Changed事件所做的事情。
Class MyClass
Public Property OverallStatus As Boolean
Get
Return _OverallStatus
End Get
Set (value As Boolean)
If _OverallStatus = value Then Exit Property
_OverallStatus = value
OnOverallStatusChanged(EventArgs.Empty)
End Set
End Property
Private _OverallStatus As Boolean = False
Protected Overridable Sub OnOverallStatusChanged(e As EventArgs)
RaiseEvent OverallStatusChanged(Me, e)
End Sub
Public Event OverallStatusChanged As EventHandler
End Class
在VB中,您可以使用WithEvents
和Handles
关键字处理该事件:
Class MyParent
Private WithEvents myObject As New MyClass()
Private Sub myobject_OverallStatusChanged(sender As Object, e As EventArgs) Handles myObject.OverallStatusChanged
' TODO: Write handler.
End Sub
End Class
OnOverallStatusChanged
函数对于继承类以响应更改时的第一次拍摄非常有用。
Class MyOtherClass
Inherits MyClass
Protected Overrides Sub OnOverallStatusChanged(e As EventArgs)
' TODO: Do my stuff first.
MyBase.OnOverallStatusChanged(e)
End Sub
End Class
答案 2 :(得分:2)
使用公共属性而不是公共变量。然后,只要属性设置良好,就可以将逻辑放在属性的Set方法中。
http://msdn.microsoft.com/en-us/library/65zdfbdt%28v=VS.100%29.aspx
Private number As Integer = 0
Public Property MyNumber As Integer
' Retrieves number.
Get
Return number
End Get
' Assigns to number.
Set
CallLogicHere()
number = value
End Set
End Property
答案 3 :(得分:1)
您还可以定义一个事件,每次状态更改时都会触发该事件。优点是,可以通过依赖于此状态的应用程序部分来处理更改。否则逻辑必须与状态一起实现。
应用程序的其他部分可以使用AddHandler
订阅活动。
Public Class OverallStatusChangedEventArgs
Inherits EventArgs
Public Sub New(newStatus As Boolean)
Me.NewStatus = newStatus
End Sub
Private m_NewStatus As Boolean
Public Property NewStatus() As Boolean
Get
Return m_NewStatus
End Get
Private Set
m_NewStatus = Value
End Set
End Property
End Class
Module modGlobals
Public Event OverallStatusChanged As EventHandler(Of OverallStatusChangedEventArgs)
Private m_boolOverallStatus As Boolean = True
Public Property BoolOverallStatus() As Boolean
Get
Return m_boolOverallStatus
End Get
Set
If Value <> m_boolOverallStatus Then
m_boolOverallStatus = Value
OnOverallStatusChanged(Value)
End If
End Set
End Property
Private Sub OnOverallStatusChanged(newStatus As Boolean)
RaiseEvent OverallStatusChanged(GetType(modGlobals), New OverallStatusChangedEventArgs(newStatus))
End Sub
End Module