Скриване на MDI дъщерни форми при затваряне с помощта на C#

В момента изграждам приложение с интерфейс с множество документи, но имам проблем, когато дъщерните форми се затварят чрез бутона 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