2011-09-23 70 views
0

我有一个vb.net应用程序,其中有一个主窗体。大约有10个类,每个类都有自己的功能,如tcpaction,fileactions,serialport actions等。用户与主窗体进行交互并执行某些操作,这些操作将调用这些类中的方法。现在,我在mainform中有一个通知textarea,并且我想要显示正在这些类中执行的当前操作以及它们在通知区域中的结果。最好的方式来处理事件和通知从多个来源到主要形式在vb.net

例如,当用户点击在我调用的一类“ProcessActions”方法“launchprocess”形式的“启动过程”按钮。现在,此方法尝试启动大约7个不同的进程,启动后发送“启动进程1”等通知,或者如果失败,则发送“进程1启动失败”等通知。

我目前使用的事件处理程序,并利用它们来显示通知,但与事件的量,我必须处理它越来越繁琐,我可能会在未来增加更多的类。那么是否有更好的方式来处理来自其他类的通知。

+1

@Hans您的评论似乎并不十分准确。我可以想到很多例子,程序告诉用户它在做什么。即:删除文件显示文件进入回收站的图形并显示当前正在删除的文件的名称。当它结束时,它会消失。对于用户正在与之交互的任何程序,必须有一些方法让他们知道它已完成当前过程。否则,他们会坐在那里试图决定程序是否工作,是否出错或是否仍在处理中。 – briddums

+0

@HansPassant请不要在没有知道应用程序试图构建什么应用程序的情况下得出无用代码的结论。 (我对这种全知的态度感到厌倦)我正在制作一个应用程序来测试一个嵌入式设备,其中用户在填充特定数据后单击一个按钮,应用程序进行各种端口测试,我想给用户当前测试的状态。我不认为这会是“无用的代码” – swordfish

+0

不要犹豫,在你的问题中提供相关细节,帮助人们给你一个更好的答案。让他们猜测它会在任何一端产生烦恼。 –

回答

2

我建议在所有的主要形式可以响应的类使用常见的自定义事件处理程序。首先定义一个新的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

+1:这是我在大多数基于winforms的工具中使用的模式。我更进一步将它全部抽象到一个库中,以便我的winforms实际上继承我自己的包含事件定义,后台工作进程实例等的基类。 –

相关问题