Zamykanie okien potomnych przy wylogowaniu użytkownika


(tofurman) #1

MS Visual Studio 2015, C#, WinForm, .Net FW 4.5

Piszę aplikację, posiadającą główną formę (Form1) jako bazę do uruchamiania poszczególnych modułów. Używając menu z tej formy mogę otworzyć kilka okien potomnych (Form2, Form3 ...) Okna potomne otwieram w ten sposób:

Form2 okno2 = new Form2();

okno2.Show()

Czy jest jakiś sposób, aby zamknąć wszystkie okna potomne w chwili, kiedy użytkownik programu się wylogowuje, zostawiając jednocześnie otwartą główną formę.

Chcę osiągnąć taki efekt:

Uruchamiam program i zaraz po uruchomieniu mam dostęp tylko do okna głównego. Po zalogowaniu się otrzymuję dostęp do modułów (to jest łatwe i już funkcjonuje).

Natomiast przy wylogowaniu potrzebuję, żeby program zamknął wszystkie moduły, do których niezalogowana osoba nie może mieć dostępu, pozostawiając okno główne programu (np. po to, aby mógł się zalogować inny użytkownik)


(kuba3351) #2

Wszystkie obiekty odpowiadające za okienka wrzucić do kolekcji. Z tego co widzę, to za każdy moduł odpowiada u Ciebie inna klasa więc można je połączyć interfejsem.

 

Robimy interfejs który ma metodę zamykającą okno np. close() i nech wszystkie klasy odpowiadające za okienka go implementują. Tworzymy kolekcję obiektów implementujących ten interfejs, i umieszczamy tam wszystkie otwarte okna. W momencie wylogowania zamykamy okienka w pętli for która na każdym elemencie kolekcji wykona metodę close()


(kowgli) #3

Rozwiązań jest kilka. Najprościej stworzyć “fabrykę” do tworzenia nowych okien, która przechowuje listę wszystkich aktualnie otwartych. Wtedy możesz łatwo po nich przeiterować i je pozamykać.

Nie trzeba żadnych interfejsów, bo przecież wszystkie okna dziedziczą z klay Form.


(kuba3351) #4

 

Jeśli tak jest, to faktycznie nie trzeba, nie piszę takich aplikacji na co dzień.


(Edgarus) #5

W WinFormsach, klasa Application posiada property OpenForms. Zamknij wsio co nie jest oknem głównym i po sprawie.

https://msdn.microsoft.com/en-us/library/system.windows.forms.application.openforms(v=vs.110).aspx

 

BTW, nie użyj do tego foreach :P.


(tofurman) #6

Dzięki! Tego właśnie szukałem. Całość zamknęła się w 5 linijkach kodu:

var ListaOkien = Application.OpenForms;

for (int index = ListaOkien.Count; index > 0;)

{

    index--;

    if (ListaOkien[index].Name != "Form1") ListaOkien[index].Close();

}

 

 

Dla potomnych: Jeśli użyjemy pętli foreach, to przy zamknięciu pierwszego okna, wystąpi wyjątek “Kolekcja uległa zmianie”. 

Problem rozwiązany, więc wątek można zamknąć i pozostawić dla potomnych.