我有一个vb.net应用程序,其中有一个主要的形式。大约有10个类,每个类都有自己的功能,比如操作、文件操作、串行端口操作等。用户与主表单交互,并执行将调用这些类中的方法的某些操作。现在我在mainform中有一个通知文本区,我想在通知区域中显示这些类中正在执行的当前操作及其结果。
例如,当用户单击表单中的"启动进程"按钮时,我调用类"ProcessActions"中的"launchprocess"方法。现在这个方法尝试启动大约7个不同的进程,并在启动后发送通知,如"进程1启动",或者如果失败,则发送通知,如"进程1启动失败"。
我目前使用事件处理程序,并使用它们来显示通知,但随着事件的数量,我必须处理它变得越来越麻烦,我可能不得不在未来添加更多的类。那么有没有更好的方法来处理来自其他类的通知呢?
我建议在主表单可以响应的所有类中使用通用的自定义事件处理程序。首先定义一个新的EventArgs类来处理你发回的通知:
Public NotInheritable Class NtfyEventArgs
Inherits EventArgs
Private _Action As String
Public ReadOnly Property Action As String
Get
Return _Action
End Get
End Property
Public Sub New(ByVal action As String)
_Action = action
End Sub
End Class
接下来定义一个基类来引发通知:
Public Class Base
Public Event Ntfy(ByVal sender As Object, ByVal e As NtfyEventArgs)
Protected Sub RaiseNtfy(ByVal action As String)
RaiseEvent Ntfy(Me, New NtfyEventArgs(action))
End Sub
End Class
让每个其他类从基类继承。这样发送通知就变得很容易了:
Public Class ProcessActions
Inherits Base
Public Sub LaunchProcess
'Do stuff
RaiseNtfy("Process 1 launched")
'Do more stuff
RaiseNtfy("Process 2 launched")
End Sub
End Class
最后,在主表单中,监听子类
引发的任何事件Public Class Form1
Private WithEvents process As New ProcessActions
Private WithEvents file As New FileActions
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'Add Event handlers
AddHandler process.Ntfy, AddressOf HandleNtfy
AddHandler file.Ntfy, AddressOf HandleNtfy
End Sub
'One procedure to handle all the incoming notifications
Private Sub HandleNtfy(ByVal sender as Object, ByVal e as NtfyEventArgs)
lblNtfy.Text = e.Action
'If need to take different actions based on the class sending notification
If TypeOf(Sender) Is ProcessActions Then
'Specific code for ProcessActions
End If
End Sub
End Class