【问题标题】:best way to handle events and notifications from multiple sources to a main form in vb.net将来自多个来源的事件和通知处理到 vb.net 中的主窗体的最佳方法
【发布时间】:2011-11-23 10:53:30
【问题描述】:

我有一个 vb.net 应用程序,其中有一个主窗体。大约有 10 个类,每个类都有自己的功能,如 tcpactions、fileactions、串行端口操作等。用户与主窗体交互并执行某些操作,这些操作将调用这些类中的方法。现在我在主窗体中有一个通知文本区域,我想在这些类中显示当前正在执行的操作以及它们在通知区域中的结果。

例如,当用户单击表单中的“启动进程”按钮时,我会调用“ProcessActions”类中的“launchprocess”方法。现在此方法尝试启动大约 7 个不同的进程,并在启动后发送通知,例如“进程 1 启动”,如果失败,它会发送通知,例如“进程 1 启动失败”。

我目前使用事件处理程序并使用它们来显示通知,但是由于我必须处理的事件数量越来越多,因此我将来可能需要添加更多类。那么有没有更好的方法来处理来自其他类的通知。

【问题讨论】:

  • @Hans 您的评论似乎不太准确。我可以想到许多程序告诉用户它在做什么的例子。即:删除文件显示进入回收站的文件的图形,并显示当前正在删除的文件的名称。完成后它就消失了。对于用户正在与之交互的任何程序,必须以某种方式让他们知道它已完成当前过程。否则,他们会坐在那里试图决定程序是否正常工作、是否出错,或者是否仍在处理中。
  • @HansPassant 请不要在不知道我正在尝试构建什么应用程序的情况下得出其无用代码的结论。 (我厌倦了这种无所不知的态度)我正在制作一个应用程序来测试一个嵌入式设备,其中用户在填写某些数据后单击一个按钮,并且该应用程序进行各种端口测试,我想给用户当前测试的状态。我不认为这将是“无用的代码”
  • 不要犹豫,在您的问题中加入相关细节,帮助人们给您更好的答案。让他们猜测确实会在两端产生烦恼。

标签: vb.net event-handling


【解决方案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

【讨论】:

  • +1:这是我在大多数基于 winforms 的工具中使用的模式。我更进一步,将其全部抽象到一个库中,以便我的 winforms 实际上继承了我自己的包含事件定义、后台工作进程实例等的表单基类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 2014-09-19
相关资源
最近更新 更多