Как закрыть родительскую форму от дочерней формы в Windows Forms 2.0? - PullRequest
3 голосов
/ 03 сентября 2008

Мне нужно закрыть родительскую форму из дочерней формы из приложения Windows. Каков наилучший способ сделать это?

Ответы [ 7 ]

4 голосов
/ 03 сентября 2008

Я наткнулся на эту запись в блоге, которая выглядит так, как будто она будет работать, и использует концепцию обработчика событий из ответа D2VIANT

http://www.dotnetcurry.com/ShowArticle.aspx?ID=125

Резюме: Шаг 1. Создайте новое приложение для Windows. Откройте Visual Studio 2005 или 2008. Выберите «Файл»> «Создать»> «Проект»> «Visual Basic» или «Visual C #» в «Типах проектов»> «Приложение Windows». Дайте проекту имя и местоположение> OK.

Шаг 2: Добавить н Новая форма для проекта. Щелкните правой кнопкой мыши проект> Добавить> Windows Forms> Form2.cs> Добавить.

Шаг 3. Теперь в Form1 перетащите кнопку «btnOpenForm» и дважды щелкните ее, чтобы сгенерировать обработчик события. Напишите в нем следующий код. Также добавьте обработчик события frm2_FormClosed, как показано ниже:

    private void btnOpenForm_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.FormClosed += new FormClosedEventHandler(frm2_FormClosed);
        frm2.Show();
        this.Hide();
    }


    private void frm2_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Close();
    }
3 голосов
/ 03 сентября 2008

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

0 голосов
/ 09 августа 2017

Это очень простое решение.

Проблема (чтобы быть уверенным): Запускает приложение (основная форма)> Открыть дочернюю форму основной формы Кнопка VIA или любое событие> Закрывается (основная форма), но дочерняя форма также закрывается.

Решение:

Использование: Process.Start("Your_App's_EXE_Full_Path.exe");

Пример. Попробуйте получить полный путь:

  1. string FullPath = Environment.CurrentDirectory + "\\YourAppName.exe";

  2. Process.Start(FullPath);.

  3. this.Close();

    • таким образом, вы получите все формы, которые хотите оставить открытыми.
0 голосов
/ 03 сентября 2008

Я согласен с Давидгом; Вы можете добавить ссылку на родительскую форму в конструктор дочерней формы, а затем закрыть нужную родительскую форму:

private Form pForm;
public ChildForm(ref Form parentForm)
{
    pForm = parentForm;
}

private closeParent()
{
    if (this.pForm != null)
        this.pForm.Close();
    this.pForm = null;
}
0 голосов
/ 03 сентября 2008

Вы явно используете правильный способ открывать и закрывать формы. Если вы используете любую форму MVC или MVP, эта проблема не возникнет.

Так что используйте форму MVP или MVC для решения этой проблемы.

0 голосов
/ 03 сентября 2008

Возможно, стоит подумать о том, чтобы родитель подписался на событие для ребенка, и ребенок может запустить это событие, когда захочет закрыть родителя. Затем родитель может обработать свое собственное закрытие (вместе с дочерним).

0 голосов
/ 03 сентября 2008

Класс Form не предоставляет никаких ссылок на «родительскую» форму, поэтому прямого доступа к родительскому элементу нет (если только это не родительский объект MDI, в этом случае вы можете получить к нему доступ через свойство MDIParent). Вам нужно будет передать ссылку на родителя в конструкторе потомка или свойстве, а затем не забыть установить его, а затем использовать эту ссылку, чтобы принудительно закрыть родительский элемент.

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