Как сделать так, чтобы дочерние формы второго уровня подсказывали при закрытии? - PullRequest
1 голос
/ 09 февраля 2010

Проблема : событие FormClosing () диалогового окна возникает, если оно является дочерним, то есть его свойство Owner установлено на родительскую форму, но НЕ, если оно является дочерним. Таким образом, закрытие главной формы не вызывает событие закрытия в диалогах внуков.

Сведения : диалоговое окно предлагает «Сохранить изменения?» С кнопками YesNoCancel в событии FormClosing (). При нажатии кнопки «Отмена» диалоговое окно остается открытым, т. Е. Отменяется закрытие.

Private Sub Dialog_FormClosing(...) Handles Me.FormClosing
    If MessageBox.Show("Save Changes?", YesNoCancel) = No Then
        e.Cancel = True
    End If
End Sub

Таким образом, создание нового диалога с установленным свойством Owner ...

// called from the main form
Dim dlg As New Dialog
dlg.Owner = Me
dlg.Show()

... имеет то преимущество, что диалоговое окно предложит сохранить, если пользователь попытается закрыть владельца / родителя. При нажатии кнопки «Отмена» диалоговое окно останется открытым, а также его владельцем.

Но если это же диалоговое окно было показано от потомка родителя (также с установленным свойством владельца), а не от родителя:

// called from another child 
Dim dlg As New Dialog
dlg.Owner = Me
dlg.Show()

Тогда событие FormClosing () для дочернего элемента не возникает, если закрывается самый верхний родительский элемент.

Это известное ограничение дизайна в рамках? Есть ли что-то, что я должен рассмотреть, прежде чем начать взламывать неприятное решение для этого?

Спасибо за любые ответы.

1 Ответ

1 голос
/ 09 февраля 2010

Да. Частично проблема заключается в том, что вы говорите о них как о диалогах, но на самом деле не используете метод ShowDialog () для их отображения. Это сделало бы невозможным для пользователя закрыть основную форму во время отображения диалогового окна. Цикл сообщений завершается, когда закрывается основная форма, остальные формы удаляются без выполнения обычной последовательности выключения.

Одним из решений является проактивное закрытие форм самостоятельно, когда закрывается основная форма. Это сработало хорошо:

  Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    For frm As Integer = Application.OpenForms.Count - 1 To 1 Step -1
      Application.OpenForms(frm).Close()
      If Application.OpenForms.Count - 1 = frm Then
        e.Cancel = True
        Exit For
      End If
    Next
  End Sub

Возможно, вам следует обратить внимание на e.CloseReason, чтобы не блокировать завершение работы Windows.

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