【发布时间】:2017-09-14 01:10:58
【问题描述】:
希望就从我的表单上的实例化类捕获返回的消息获得一些最佳实践建议。
在我的表单 (form1.vb) 中,我有一个标签,它反映了正在执行的操作,代码如下。
form1.vb 中显示消息的代码:
Public Sub DisplayMessage(ByVal Msg as String, ByVal Show as Boolean)
Application.DoEvents()
If Show Then
lblShow.Text = Msg
lblShow.Refresh()
End If
End Sub
到目前为止,我遇到了三种方法:
-
直接表单调用。在这种情况下,类直接调用表单的消息例程:
form1.DisplayMessage("Show This Message", True) -
类内的RaiseEvent。 在这种情况下,form1 是发送消息的类的Friends WithEvents,该类将事件引发到窗体。
**Declared in Form1.vb** Friend WithEvents Class1 as New Class1 **Declared in Class1.vb** Public Event SetMessage(ByVal Msg As String, ByVal Show As Boolean) **Used in Class1.vb** RaiseEvent SetMessage("Show This Message", True) -
让 EventArgs 类处理事件。 在这种情况下,我们有一个 EventArg.vb 类,它在我们引发事件时被实例化。
**Declared in Form1.vb** Friend WithEvents Class1 as New Class1 Private Sub class1_DisplayMessage(ByVal Msg As String, ByVal showAs Boolean, ByRef e As ProgressMessageEventArgs) Handles Class1.SetMessage DisplayMessage(Msg, Show) End Sub
**Declared in Class1.vb**
Public Event SetMessage(ByVal msg As String, ByVal Show As Boolean, ByRef e As ProgressMessageEventArgs)
Protected Sub CaptureMessage(ByVal msg As String, ByVal Show As Boolean)
RaiseEvent SetMessage(message, ShowList, New ProgressMessageEventArgs(message))
End Sub
**Used in Class1.vb**
RaiseEvent CaptureMessage("Show This Message", True)
**EventArg.vb created to handle ProgressMessageEventArgs class**
Public NotInheritable Class ProgressMessageEventArgs
Inherits System.EventArgs
Public txt As String
Public Sub New(ByVal txt As String)
MyBase.New()
Me.Text = txt
End Sub
End Class
场景 1 似乎是最简单的,尽管有人建议我不要这样做,并要求我提出一个事件。随着时间的推移,我遇到了场景 3,其中涉及一个额外的类与场景 2。
因此,问题是... 在这三种方法之间,哪一种是将消息从类返回到表单的“正确”方式?由于场景 2 也可以正常工作,因此是否需要根据场景 3 额外的 EventArg 类?
非常感谢。
【问题讨论】:
-
“最佳实践”视情况而定。这三种形式中的任何一种都可以根据用例起作用。但是,
Application.DoEvents,默认表单实例和非标准事件签名不是任何最佳实践的一部分 -
你真的应该能够做到
lblShow.Text = Msg,除非你从不同的线程运行。为什么是Application.DoEvents和Refresh? -
引发和处理事件与调用方法没有太大区别。如果在表单持有引用的单独类中运行,那么您可能希望从该类引发事件,因为该类无法调用表单上的方法。如果您是多线程,即另一个类在非 UI 线程上执行长时间运行的方法,您将需要在表单的事件处理程序中处理标签更新的调用。因此,如果没有更多信息,答案并不简单。如果可以的话,我很乐意提供更多帮助。
-
@djv - 干杯。我明白了这个想法,并将在我的编码中实现它。目前我开发的工具都是非常简单的东西(通常是一个按钮,顺序脚本执行),但我对我的编码方式并不满意。我会投票给你的回复作为答案,但我似乎还没有投票权....
标签: vb.net winforms code-standards