Родительская форма закрывается при закрытии дочерней формы

#c# #forms #event-handling

#c# #формы #обработка событий

Вопрос:

В моем приложении на C # у меня есть следующий метод, который вызывается при закрытии основной формы.

 private void FormMain_Closing(object sender, FormClosingEventArgs e)
{ 
        // Show this dialog when the user tries to close the main form
        Form testForm = new FormTest();
        testForm.StartPosition = FormStartPosition.CenterParent;
        testForm.ShowDialog();
}   
  

Это создает диалоговое окно, которое покажет, когда закрывается основная форма. Однако моя проблема заключается в том, что когда пользователь закрывается testForm , основная форма закрывается сразу после этого. Я перепробовал всевозможные варианты e.Cancel = true; и тому подобное, и все еще не могу отменить закрытие основной формы.

Есть идеи?


Редактировать: похоже, я столкнулся с проблемой, используя два ShowModal() ‘s подряд. Изучаю проблему…


Редактировать: использовалось this.DialogResult = DialogResult.None; и, похоже, устранило мою проблему. По-видимому, это известная проблема в WinForms при открытии модального диалога из модального диалога.

Комментарии:

1. Я предлагаю вам поместить свое решение в answer дополнение к вашему question и пометить его как правильный ответ. Таким образом, другие люди будут знать, что на этот вопрос уже дан ответ, а также увидят, что вы сделали для решения проблемы.

Ответ №1:

У меня этот код отлично работает. Я думаю, что проблема в другой части вашего кода.

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    Form testForm = new FormTest();
    testForm.StartPosition = FormStartPosition.CenterParent;
    testForm.ShowDialog();

    e.Cancel = testForm.DialogResult == DialogResult.Cancel;
}
  

Ответ №2:

Это также может быть обработано дочерними элементами из документов:

Если у формы есть какие-либо дочерние или принадлежащие формы, для каждой из них также вызывается событие FormClosing. Если какая-либо из форм отменяет событие, ни одна из форм не закрывается. Поэтому соответствующие события FormClosed не отправляются ни в одну из форм.

Ответ №3:

Я знаю, что вы упоминаете в своем вопросе, что пытались использовать ‘e.Отмена = true;’ Однако следующий код работает в моей среде (.NET 4.0, Visual Studio 2010, Windows 7):

  private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
     // Show this dialog when the user tries to close the main form
     Form testForm = new FormTest();
     testForm.StartPosition = FormStartPosition.CenterParent;
     testForm.ShowDialog();
     e.Cancel = true;
 }
  

Если в вашем случае это не сработает, возможно, у вас работают другие обработчики событий. В таком случае попробуйте этот код во вновь созданном приложении Windows Forms.

Комментарии:

1. Кроме того, .NET 4.6 по сравнению С 2015 годом выигрывает 7 (спустя почти 6 лет вы получаете право голоса «за» 🙂 Обратите внимание, что вам нужно отслеживать результаты любых дочерних форм, которые были открыты.