Форма VB.NET ShowDialog не заканчивается - PullRequest
0 голосов
/ 04 ноября 2010

Я конвертировал это приложение из VB6. У меня есть 2 формы. Form1 создает экземпляр Form2 через пункт меню. У меня возникают проблемы с завершением формы Form2 при нажатии кнопки закрытия (X). Если Form2 «бездействует», он закрывается нормально; но если я нахожусь в цикле обработки чего-либо, все события запускаются, но это продолжает обрабатывать в Form2. Я пытался возиться с Dispose, Close, Application.Exit, Application.ExitThread. Моя последняя попытка была создать мое собственное событие для запуска в Form1 и уничтожения Form2 - и это ударило его, но Form2 все еще работает В чем дело? Кстати, если я использую только Show vs ShowDialog - Form2 просто мигает и исчезает.

Form1 does this
Dim f2 as Import
:
        Hide()
        f2 = New Import
        AddHandler f2.die, AddressOf killf2
        f2.ShowDialog(Me)
        Show()

Private Sub killf2()
        f2.Dispose()
        f2 = Nothing
End Sub

Form2

Public Event die()
Private Shadows Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        Dispose()
        Close()
        e.Cancel = False
        RaiseEvent die()
End Sub

Ответы [ 2 ]

0 голосов
/ 06 декабря 2010

Что это за петля, о которой вы говорите? Пользовательский интерфейс (Windows) отделен от любого кода, который выполняется. В форме, производной от вашего класса, Code разрешено запускать как до создания формы, так и после ее уничтожения. Если код пытается получить доступ к объектам пользовательского интерфейса, то может возникнуть исключение, но в противном случае ваш код не сможет остановить выполнение кода при отсутствии пользовательского интерфейса.

Если вы хотите, чтобы ваш цикл for завершился, вы должны как-то отправить ему сигнал, например, путем создания логической переменной-члена "quit". Установите "quit = True", когда ваша форма закрывается, а затем проверьте цикл "for", верно ли это.

0 голосов
/ 04 ноября 2010

Я думаю, вы пересекли свои события.Вы хотите, чтобы form1, содержащая экземпляр form2, прослушивала событие form2closing в form2.Тогда вы можете установить f2 = ничего.

Форма 1 должна полностью заключать форму 2.

вот пример:

Public Class MDIMain
    Private WithEvents _child As frmViewChild

    Friend Sub viewChildShow()
        _child = New frmViewChild
        _child.MdiParent = Me
        _child.WindowState = FormWindowState.Maximized
        _child.Show()
    End Sub

    Private Sub _child_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles _child.FormClosing
        _child = Nothing
    End Sub

не добавляйте ничего в форму2, попробуйте

Dim f2 as Import
        Hide()
        f2 = New Import
        f2.ShowDialog(Me)
        Show()

Private Sub f2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles f2.FormClosing
        set f2 = nothing
End Sub

re: ваш комментарий возвращается в форму form2 и продолжает обработку следующего оператора в обработчике события click

, который является функцией, и она будет вызывать такое поведение.вам нужно убедиться, что me.close или close me является последним утверждением в form2, что выполнять больше нечего.

...