假设我有课堂foo:
Public Class foo
End Class
现在让我说我有一个外部调用的函数:
Public Class foo
Public Sub my_sub ()
End Sub
End Class
如果,有时候,我希望其他函数能够知道何时调用此函数并满足某些条件,该怎么办?没问题,我会创建一个事件:
Public Class foo
Event something_happened ()
Public Sub my_sub ()
If some_condition_is_met Then
RaiseEvent something_happened ()
Else
'Do Nothing!
End If
End Sub
结束班
现在,当我创建类的实例时,我必须将其声明为:
Dim WithEvents my_foo As foo
好吧,当我在表单类中创建自己的事件以供其他类接收时,VB会抱怨,因为表单的实例未声明为:
WithEvents
我如何使表单支持添加可以与其他应用程序一起接收的事件,考虑到我没有在我的代码中声明一个实例,因此无法插入:
With Events
我是否更改了声明它的自动生成代码或什么?
答案 0 :(得分:0)
WithEvents
关键字并不神奇地表示对象会引发事件或其他对象可以处理它们。 WithEvents
关键字具体表示可以在Handles
子句中使用变量。那就是它。
如果一个对象引发了事件,那么就会引发事件。如果要处理这些事件并且该对象未分配给声明为WithEvents
的变量,则使用AddHandler
语句将方法注册为事件的处理程序。然后,当您不想再处理该事件时,请使用RemoveHandler
。
请注意,虽然语法略有不同,但这是在C#中处理事件的唯一方法;没有相当于WithEvents
和Handles
。
答案 1 :(得分:0)
我不知道我是否理解了这个问题,但是,这个(非常简化的)例子怎么样?
Public Class YourForm
Inherits System.Windows.Forms.Form
Public Event E1()
' In this example event may be fired on form loading.
Public Sub YourForm_Load() Handles MyBase.Load
If True Then ' You may use your conditionals here.
RaiseEvent E1()
End If
End Sub
End Class
Public Class AnotherForm
' You may not need to inherit from Form
Inherits System.Windows.Forms.Form
Dim WithEvents F1 As YourForm
Public Sub New()
MyBase.New()
F1 = New YourForm()
End Sub
Public Sub YourFormLoadingHandler() Handles F1.E1
'Handle your event here
End Sub
End Class
每当YourForm设置为由AnotherForm加载时,您就有机会在第二个类中处理该事件。
我可能还没有理解这个问题。
问候。
答案 2 :(得分:0)
在阅读你的评论后,我想我明白了你的意思。请看一下:
Public Class DesignerForm
Public Event YourEvent()
Private LC As ListenerClass
Private Sub YourMethod()
If True Then 'Your conditionals go here.
RaiseEvent YourEvent()
End If
End Sub
Private Sub DesignerForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
LC = New ListenerClass(Me)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
YourMethod()
End Sub
End Class
Public Class ListenerClass
Private WithEvents DF As DesignerForm
Public Sub New(ByRef DF As DesignerForm)
Me.DF = DF
End Sub
Private Sub YourEventExternalHandler() Handles DF.YourEvent
'Here you handle YourEvent outside your Main Form Class.
End Sub
End Class
您的主表单类由WFD直接生成,您的类将引用其运行时实例。在此示例中,单击Button1时会触发YourEvent并在ListenerClass中处理。
P.S。 所有这一切只有在您可以从ListenerClass(任何类型:项目引用,动态加载等)中至少具有某种DesignerForm类的可见性时,否则您甚至无法引用它,您将不得不使用它常见的进程间通信机制。