在vb.net中处理多个源到主窗体的事件和通知的最佳方式



我有一个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

相关内容

  • 没有找到相关文章

最新更新