在主窗体上允许自定义事件?

时间:2014-08-04 02:49:52

标签: .net vb.net winforms class events

假设我有课堂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

我是否更改了声明它的自动生成代码或什么?

3 个答案:

答案 0 :(得分:0)

WithEvents关键字并不神奇地表示对象会引发事件或其他对象可以处理它们。 WithEvents关键字具体表示可以在Handles子句中使用变量。那就是它。

如果一个对象引发了事件,那么就会引发事件。如果要处理这些事件并且该对象未分配给声明为WithEvents的变量,则使用AddHandler语句将方法注册为事件的处理程序。然后,当您不想再处理该事件时,请使用RemoveHandler

请注意,虽然语法略有不同,但这是在C#中处理事件的唯一方法;没有相当于WithEventsHandles

答案 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类的可见性时,否则您甚至无法引用它,您将不得不使用它常见的进程间通信机制。