два метода, обрабатывающие Me.FormClosing; почему они стреляют в этом конкретном порядке? - PullRequest
3 голосов
/ 11 августа 2011
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
      Handles Me.Load, Me.FormClosing
        MessageBox.Show("form_load")
End Sub


Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) _
    Handles Me.FormClosing
    MessageBox.Show("form_closing")
End Sub

При закрытии формы я заметил, что сначала запускается метод Form1_FormClosing, а затем Form1_Load.

Почему выбран этот заказ? Почему Form1_Load не будет уволен / введен первым, а затем Form1_FormClosing вторым?

Как .NET выбирает, какой метод запустить первым, из двух, которые обрабатывают одно и то же событие?

1 Ответ

2 голосов
/ 11 августа 2011

Оба метода имеют Handles Me.FormClosing, поэтому оба метода выполняются, когда форма закрыта. Там нет конкретного ордера, в котором они казнены.

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

Private Sub Aaa(ByVal sender As Object, ByVal e As FormClosingEventArgs)
    Handles Me.FormClosing
    MsgBox("Aaa")
End Sub

Кстати, я удивлен, что ваш код компилируется, поскольку Form.Load имеет подпись, отличную от Form.FormClosing.


Если вы хотите, чтобы код выполнялся в определенном порядке, обрабатывайте событие только один раз и вызывайте другие методы по порядку.

Private Sub Form1_Load(sender As Object, e As EventArgs)
    Handles Me.Load
    ReportLoad()
End Sub

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs)
    Handles Me.FormClosing
    ReportLoad()
    MsgBox("Form1_FormClosing")
End Sub

Private Sub ReportLoad()
    MsgBox("ReportLoad")
End Sub

Обработка события в методе с другим именем вводит в заблуждение и сбивает с толку. Я бы никогда не догадался, что Form1_Load будет вызван событием FormClosing. Если вы хотите обработать несколько событий или одно и то же событие нескольких объектов в одном методе, измените имя метода, например Form1_xxx или xxxButton_Click, чтобы было ясно, что обрабатывается несколько событий.

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