VB.NET:WithEvents不工作

时间:2010-04-21 23:56:17

标签: vb.net events event-handling

我有以下课程:

Public Class Email

    Private Shared ReadOnly EMAIL_REGEX = "\b[a-zA-Z]+[a-zA-Z0-9._+-]+@" + _
                                      "[a-zA-Z0-9.-]+\.[a-zA-Z]{2,3}\b"
    Private _email As String

    Public Event emailCreated()

    ' Declare empty constructor private so the only way to create an object
    ' is using new (email)
    Private Sub New()

    End Sub

    Sub New(ByVal email As String)
        If Regex.IsMatch(email, EMAIL_REGEX) Then
            _email = email
            RaiseEvent emailCreated()
        Else
            Throw New Exception("Email Not Valid")
        End If
    End Sub

    ReadOnly Property Email() As String
        Get
            Return _email
        End Get
    End Property

End Class

并且

Public Class EmailForm

    WithEvents myEmail As Email

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            myEmail = New Email(TextBox1.Text)
        Catch ex As Exception
            MessageBox.Show("Exception: " & ex.Message)
        End Try
    End Sub

    Public Sub emailCreated() Handles myEmail.emailCreated
        MessageBox.Show("New Email Created")
    End Sub

End Class

如果创建错误的电子邮件让我们说“电子邮件”异常被正确缓存并显示一条消息但是我输入的是有效的电子邮件,则不会引发该事件,正在创建该对象但未显示任何消息且没有错误或者抛出异常我怀疑它与使用“myemail = new Email(email)”有关,但我已经看到了使用new和withevents没有问题的例子。 我会对这个问题提出任何意见

谢谢

修改:供将来参考 - VB.NET - problem with member's event handling

2 个答案:

答案 0 :(得分:3)

您不应使用正则表达式验证电子邮件地址

您应该使用MailAddress类:

Sub New(ByVal email As String)
    New MailAddress(email).ToString()
End Sub

MailAddress类使用BNF解析器验证地址,如果地址无效,则会抛出FormatException

您的正则表达式会拒绝admin@mta.info等有效地址。


要回答您的问题,系统会在WithEvents字段有值之前引发该事件。

执行代码时会发生以下情况:

  1. New Email(TextBox1.Text) - 创建Email对象,构造函数引发事件 此时,事件没有处理程序,因此事件不会执行任何操作。
  2. myEmail = ...新的Email对象已分配给myEmail字段,并添加了事件处理程序。
  3. 无法解决此问题,因为在构造函数完成之前无法获取对象的引用。

    相反,你应该摆脱这个事件并将myEmail字段变成属性设置器中带有代码的属性

答案 1 :(得分:1)

首先猜测:在事件连接到它之前创建电子邮件。在你甚至没有构造函数之前触发事件,在VB甚至有机会添加事件处理程序之前,所以事件永远不会被看到。

更大的图片视图。您是否有特殊原因需要触发emailCreated事件?看起来这个事件永远不会在你自己的课堂之外处理,即使你最终让它工作,所以使用事件会增加你可能不需要甚至不需要的复杂性。