W .NET formularze systemu Windows mają zdarzenie, które jest wyzwalane przed załadowaniem formularza (Form.Load), ale nie ma odpowiedniego zdarzenia, które jest wyzwalane PO załadowaniu formularza. Chciałbym wykonać jakąś logikę po załadowaniu formularza.
Czy ktoś może doradzić rozwiązanie?
Odpowiedzi:
Możesz użyć zdarzenia „Shown”: MSDN - Form.Shown
„Zdarzenie Shown jest wywoływane tylko przy pierwszym wyświetleniu formularza; późniejsze zminimalizowanie, maksymalizacja, przywrócenie, ukrycie, pokazanie lub unieważnienie i ponowne malowanie nie spowoduje podniesienia tego zdarzenia”.
źródło
Shown += Form1_Shown;
zgodnie z sugestią w innym wątkuCzasami używam (w Load)
lub
(zmień „this” na swoją zmienną formularza, jeśli obsługujesz zdarzenie w instancji innej niż „this”).
To wypycha wywołanie do pętli Windows-Forms, więc jest przetwarzane, gdy formularz przetwarza kolejkę komunikatów.
[aktualizowane na żądanie]
Metody Control.Invoke / Control.BeginInvoke są przeznaczone do użytku z wątkami i są mechanizmem wypychania pracy do wątku interfejsu użytkownika. Zwykle jest to używane przez wątki robocze itp. Control.Invoke wykonuje wywołanie synchroniczne, podczas gdy Control.BeginInvoke wykonuje wywołanie asynchroniczne.
Zwykle byłyby używane jako:
Robi to poprzez wypychanie wiadomości do kolejki wiadomości systemu Windows; Wątek interfejsu użytkownika (w pewnym momencie) usuwa z kolejki wiadomość, przetwarza delegata i sygnalizuje pracownikowi, że zakończył pracę ... na razie tak dobrze ;-p
DOBRZE; więc co się stanie, jeśli użyjemy Control.Invoke / Control.BeginInvoke w wątku interfejsu użytkownika? Radzi sobie ... jeśli wywołasz Control.Invoke, rozsądnie jest wiedzieć, że blokowanie kolejki komunikatów spowodowałoby natychmiastowy zakleszczenie - więc jeśli jesteś już w wątku interfejsu użytkownika, po prostu natychmiast uruchamia kod ... więc nam nie pomaga ...
Ale Control.BeginInvoke działa inaczej: zawsze wypycha pracę do kolejki, nawet jeśli jesteśmy już w wątku interfejsu użytkownika. To naprawdę prosty sposób na powiedzenie „za chwilę”, ale bez niedogodności związanych z licznikami czasu itp. (Które i tak musiałyby robić to samo!).
źródło
Za pierwszym razem NIE BĘDZIE uruchomił „AfterLoading”,
po prostu zarejestruje go, aby rozpocząć NEXT Loading .
źródło
Miałem ten sam problem i rozwiązałem go w następujący sposób:
Właściwie chcę pokazać wiadomość i zamknąć ją automatycznie po 2 sekundach. W tym celu musiałem wygenerować (dynamicznie) prosty formularz i jedną etykietę pokazującą wiadomość, zatrzymaj wiadomość na 1500 ms, aby użytkownik ją przeczytał. I Zamknij dynamicznie tworzoną formę. Pokazane zdarzenie występuje po zdarzeniu ładowania. Więc kod jest
źródło
Możesz również spróbować umieścić swój kod w zdarzeniu Activated formularza, jeśli chcesz, aby to nastąpiło, gdy formularz jest aktywowany. Musiałbyś jednak ustawić boolean "wykonał" sprawdzenie, jeśli ma on działać tylko przy pierwszej aktywacji.
źródło
To stare pytanie i zależy bardziej od tego, kiedy musisz rozpocząć swoje procedury. Ponieważ nikt nie chce zerowego wyjątku odniesienia, zawsze najlepiej jest najpierw sprawdzić wartość null, a następnie użyć w razie potrzeby; Samo to może zaoszczędzić wiele smutku.
Najczęstszą przyczyną tego typu pytań jest sytuacja, gdy kontener lub niestandardowy typ kontrolny próbuje uzyskać dostęp do właściwości zainicjowanych poza klasą niestandardową, w której te właściwości nie zostały jeszcze zainicjowane, co może spowodować wypełnienie wartości null, a nawet spowodować wyjątki odwołań o wartości null na typach obiektów. Oznacza to, że Twoja klasa jest uruchomiona, zanim zostanie w pełni zainicjowana - przed zakończeniem ustawiania właściwości itp. Innym możliwym powodem tego typu pytań jest to, kiedy wykonać niestandardową grafikę.
Najlepszą odpowiedzią na pytanie, kiedy rozpocząć wykonywanie kodu po zdarzeniu ładowania formularza, jest monitorowanie wiadomości WM_Paint lub przechodzenie bezpośrednio do samego zdarzenia malowania. Czemu? Zdarzenie malowania jest uruchamiane tylko wtedy, gdy wszystkie moduły zostaną w pełni załadowane w odniesieniu do zdarzenia ładowania formularza. Uwaga: This.visible == true nie zawsze jest prawdziwe, gdy jest ustawione na true, więc nie jest w ogóle używane do tego celu, z wyjątkiem ukrycia formularza.
Poniżej znajduje się pełny przykład, jak rozpocząć wykonywanie kodu po zdarzeniu ładowania formularza. Zaleca się, aby nie wiązać niepotrzebnie pętli komunikatów malowania, abyśmy utworzyli zdarzenie, które rozpocznie wykonywanie kodu poza tą pętlą.
przestrzeń nazw MyProgramStartingPlaceExample {
}
źródło
Wiem, że to stary post. Ale oto jak to zrobiłem:
źródło
Możesz zamknąć formularz po pewnym wykonaniu.
//YourForm.ActiveForm.Close ();
źródło