Закрыть несколько родительских форм при закрытии основной формы - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть приложение vb.net, для которого я не использую среду приложения:

enter image description here

Это приложение имеет следующие основные:

Imports System.Threading

Module Main

    Private _sharedThing As SharedThing = New SharedThing()
    Private _appRunner As AppRunner = New AppRunner()
    Private _firstForm As Form
    Private _secondForm As SecondParent
    Public Event CloseApplication()

    Sub StartFirstParent()

        Dim firstForm = New Form1(_sharedThing, _appRunner, _secondForm)
        Application.Run(firstForm)

    End Sub


    Sub Main()

        Dim mainForm As New Form1(_sharedThing, _appRunner, _secondForm)
        Application.Run(mainForm)
        Application.Exit()
    End Sub


End Module

Как видите, я вызываю Application.Run для одной формы и, используя кнопку, создаю другую форму, форму SecondParent.Таким образом, у меня есть две родительские формы.Вот код для Form1:

Imports System.Threading

Public Class Form1

    Private _sharedThing As SharedThing
    Private _appRunner As AppRunner
    Public Event CloseApplication()
    Private _otherParentForm As SecondParent

    Public Sub New(aSharedThing As SharedThing, ByRef appRunner As AppRunner, otherParentForm As SecondParent)

        _otherParentForm = otherParentForm
        _sharedThing = aSharedThing
        _appRunner = appRunner
        _otherParentForm = otherParentForm

        Me.IsMdiContainer = True
        ' This call is required by the designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        _sharedThing.SetString("First Parent: Form1")

    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        _sharedThing.ShowString()

    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        Me.Close()

    End Sub


    Private Sub CreateSecondParent(sender As Object, e As EventArgs) Handles Button4.Click

        Dim SecondThread As New Thread(New ThreadStart(AddressOf StartSecondParent))
        SecondThread.Start()

    End Sub


    Sub StartSecondParent()

        Dim secondForm As Form = New SecondParent(_sharedThing, Me)
        Application.Run(secondForm)

    End Sub


End Class

Вот конструктор для SecondParent:

Public Class SecondParent


    Private _sharedThing As SharedThing

    Private WithEvents _myParent As Form1



    Public Sub New(ByRef aSharedThing As SharedThing, ByRef myParentForm As Form1)

        _myParent = myParentForm
        _sharedThing = aSharedThing

        Me.IsMdiContainer = True

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.

    End Sub

Я не могу найти способ закрыть форму SecondParent при выходе из формы Form1.

Как видите, в основном я вызываю Application.Exit ().Я хочу избежать этого или понять его последствия.Пожалуйста, поймите, что почти все способы написания кода - это ограничение, с которым мне приходится мириться, поэтому любые предложения по полному изменению структуры бесполезны.Если неясно, если я не использую Application.Exit (), новые созданные формы не закрываются при закрытии основной формы.

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

Public Sub KillSwitch_Sensor() Handles _myParent.CloseApplication
    Me.Close()
End Sub

Я получаю сообщение об ошибке:

 : 'Cross-thread operation not valid: Control 'SecondParent' accessed
 from a thread other than the thread it was created on.'

1 Ответ

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

Ваша проблема связана с переменными областями, а также с другими проблемами (здесь нет проверки кода).Быстрое и грязное исправление, добавьте метод в Form1 для Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing, затем сделайте то, что вам нужно сделать, когда эта форма закрывается ...

Например: переберите открытые формы и закройте те, которые вы хотите,Рекомендую, конечно, нет, но на данный момент это вариант без рефакторинга большей части кода, который у вас есть.

Одна из проблем, с которой вы можете столкнуться, - исключение Cross-thread operation, так как вы, возможно, пытаетесь закрыть форму издругая нить.Если это произойдет, вам нужно будет вызвать элемент управления, и он должен работать.

...