VB.NET: WithEvents не работает - PullRequest
       10

VB.NET: WithEvents не работает

0 голосов
/ 22 апреля 2010

У меня есть следующие классы:

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 - проблема с обработкой событий участника

Ответы [ 2 ]

3 голосов
/ 22 апреля 2010

Вы не должны проверять адреса электронной почты с помощью регулярных выражений .

Вы должны использовать класс 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 и добавляется обработчик событий.

Невозможно обойти эту проблему, потому что вы не можете получить ссылку на объект до завершения его конструктора.

Вместо этого вы должны избавиться от события и сделать поле myEmail свойством с вашим кодом в установщике свойств

1 голос
/ 22 апреля 2010

Первое предположение: электронное письмо создается до того, как к нему подключены события. Вы запускаете событие еще до того, как выйдете из конструктора, еще до того, как у VB появится возможность добавить обработчики событий, поэтому событие никогда не будет видно.

Увеличенное изображение. Есть ли конкретная причина, по которой вы хотите, чтобы событие emailCreated было запущено? Похоже, что событие никогда не будет обработано вне вашего собственного класса, даже если вы в конечном итоге получите его работающим, поэтому использование событий добавляет сложности, которая вам может не понадобиться или даже не понадобиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...