Windows Forms jak otworzyć kolejne okno formularza a zamknąć obecne.

0

Hej, czy wie ktoś jak w c# ogarnąć, że w metodzie main klasy Program za pomocą Application.run() tworzymy pierwszy formularz. W formularzu logujemy się a gdy wszystkie dane są poprawne potrzebuje zamknąć ten formularz i wywołać kolejny Application.run() tym razem przedstawiający odpowiednią treść dla zalogowanych użytkowników. Starałem się aby program po zalogowaniu robił Application.Exit() a następnie wywoływał nową aplikację z przypisanym innym formularzem w argumencie. Jednak to się nie sprawdzi.. Czy może mi ktoś powiedzieć jak się rozwiązuje taki problem ?

3

robiąc Application.Run tworzysz okno główne które będzie obsługiwało całą kolejkę komunikatów. Zamykając to okno zamykasz całą aplikację. Okno logowania pokaż zwyczajnie przez .ShowDialog() i dopiero potem utwórz główne okno aplikacji

1

Jednak to się nie sprawdzi..

Niby dlaczego nie sprawdzi?

Standardowo metoda Main wygląda tak (w .NET 6; w 4.x jest trochę inna ale to bez różnicy):

        static void Main()
        {
            ApplicationConfiguration.Initialize();
            Application.Run(new Form1());
        {

No i teraz jak dasz poniżej drugie Application.Run(), z inną albo nawet i tą samą formą, to otworzy się ona po zamknięciu pierwszej, bo Run czeka na zamknięcie formy.
Możesz tu dodać dowolną logikę.

Inna sprawa czy niestandardowy Main w WinForms to dobry pomysł. Ktoś inny oglądający kod może się w ogóle nie spodziewać że coś tu było grzebane.

1

Zgodnie ze sztuką, zamierzony efekt uzyskasz w następujący sposób: Niech główny formularz to okno właściwej aplikacji, a okienko do wpisania hasła będzie osobnym formularzem. W Main nic nie zmieniasz, natomiast w konstruktorze okna aplikacji dopisujesz this.Hide(), żeby okno wywołać, ale nie pokazało się. Możesz też w ustawieniach zrobić ShowInTaskBar=false, następnie uruchamiasz drugi formularz, mający przyciski OK i Cancel. Jak wpisze się poprawne hasło i kliknie OK, to następuje this.Show() i ShowInTaskBar=true, alby uruchomić okno aplikacji, a jak kliknie się Cancel, to robisz Application.Exit().

Inny sposób, to jeden formularz, ale na nim umieszczone dwa panele. W jednym panelu to, co ma zawierać aplikacja, a w drugim panelu pole tekstowe do hasła, przyciski OK i Cancel. Dla pierwszego panelu ustawiasz Visible=false, dla drugiego Visible=true. W przypadku poprawnego hasła i OK zmieniasz Visible obu paneli, a w przypadku Cancel robisz this.Close() (to samo, co zwykłe zamknięcie okna).

0

@andrzejlisek: Jasne, tylko czy kiedy wywołam ten drugi formularz ( do logowania ) za pomocą Application.Run() i logowanie pójdzie pomyślnie i ustawi właściwość i metodę dla głównego formualrza (ShowInTaskbar = true, this.Show()) to jak zamknąć ten formularz z logowaniem, żeby nie był widoczny ?

Druga sprawa jak w osobnym formularzu ( który jest obiektem zupełnie innej klasy ) moge zmienić składową innego obiektu. Form główny nie jest tej samej klasy co FORM okna logowania

1
Kuba Czarnecki napisał(a):

@andrzejlisek: Jasne, tylko czy kiedy wywołam ten drugi formularz ( do logowania ) za pomocą Application.Run() i logowanie pójdzie pomyślnie i ustawi właściwość i metodę dla głównego formualrza (ShowInTaskbar = true, this.Show()) to jak zamknąć ten formularz z logowaniem, żeby nie był widoczny ?

Pod przyciskiem OK, czy tam Zaloduj wywołujesz this.Close(). To powoduje zamknięcie okna. A jak wywołałeś je modalnie z funkcji będącej w głównym formularzu, to potym nastapi ciąg dalszy tej funkcji, w której za pomocą this.Show() możesz uwidocznić ten główny formularz.

Kuba Czarnecki napisał(a):

Druga sprawa jak w osobnym formularzu ( który jest obiektem zupełnie innej klasy ) moge zmienić składową innego obiektu. Form główny nie jest tej samej klasy co FORM okna logowania

W właściwościach każdej kontrolki masz Modifier, po przestawieniu na Public masz możliwość odwołać się z zewnątrz do tej kontrolki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1