Скрытие дочерних форм MDI при закрытии с помощью С#

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

Я попытался установить событие закрытия формы, чтобы просто скрыть форму, но затем, когда пользователь закрывает основную родительскую форму, приложение не закрывается.

Есть ли способ обойти это?

Вот код, который я сейчас использую для события закрытия формы моих дочерних форм:

private void ParameterForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason != CloseReason.FormOwnerClosing)
    {
        this.Hide();
        e.Cancel = true;
    }
}

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


person isometrik    schedule 16.05.2011    source источник


Ответы (1)


Формы предназначены для открытия и закрытия пользователем. И действительно, когда они закрываются, экземпляр объекта подлежит уничтожению, в результате чего вы теряете все данные, хранящиеся в полях или свойствах, связанных с этим экземпляром объекта.

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

Однако, если вы просто хотите, чтобы это работало, это тоже возможно. Вам нужно изменить код в обработчике событий FormClosing, чтобы только предотвращал закрытие дочерних форм, когда свойство e.CloseReason указывает, что они закрываются в результате прямого взаимодействия с пользователем:

private void ParameterForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        this.Hide();
        e.Cancel = true;
    }
}

Причина, по которой ваша проверка не работает (e.CloseReason != CloseReason.FormOwnerClosing), заключается в том, что у вас есть приложение MDI. Существует особая причина, которая используется при закрытии родителя MDI: CloseReason.MdiFormClosing. Вы можете следить за этим тоже, но проще сделать так, как показано выше, потому что вы не хотите, чтобы окна закрывались, например, при завершении работы Windows.

person Cody Gray    schedule 16.05.2011