2010-09-08 18 views
24

Chciałbym, aby ktoś spróbował wyjaśnić różnicę między nimi. Dokładniej, przykładowy scenariusz użycia.Form_Load() "event" lub Override OnLoad()

ja refactoring pewne Okna postaci kodu a Form ma jakiś kod w zdarzeniu Form_Load() a także w protected override void OnLoad() przypadku nazywa base.OnLoad(e); Teraz odnaleźć go i pożary Override, a potem od razu odpala wersję zdarzeń.

Który z nich jest zwykle używany i dlaczego?

+0

zobaczyć również https://stackoverflow.com/questions/2521322/what-setup-code-should-go-in-form-constructors-versus-form-load-event – DaveInCaz

Odpowiedz

23

Powinieneś zawsze przesłonić OnLoad(). Korzystanie z wydarzenia jest właściwe tylko wtedy, gdy klasa zainteresuje się wydarzeniem. Do czego służą wydarzenia. Inna klasa zainteresowana zdarzeniem Wczytaj jest bardzo rzadka, tylko bardzo przydatna do robienia okien.

Nadal jednak ładowanie działa dobrze z projektantem, a programiści VB6 są z nim bardzo dobrze. To nie jest strasznie źle, wpadniesz tylko w kłopoty, gdy zaczniesz dziedziczyć formularz, a kod nie będzie działał we właściwej kolejności.

Większość kodu, który teraz zostanie wstawiony do zdarzenia Load, naprawdę należy do konstruktora. Potrzebujesz tylko OnLoad, jeśli:

  • Musisz znać dokładny rozmiar i położenie okna. OnLoad jest najlepszy, tworzony jest uchwyt okna i stosowane są preferencje użytkownika (tytuł i rozmiar ramki), a formularz został przeskalowany zgodnie z poleceniem właściwości Form.AutoScaleMode. Okno nie jest jeszcze widoczne, bardzo dobry czas na przeniesienie okna w inne miejsce lub ustawienie elementów sterujących dla dzieci.
  • Masz kod, który potrzebuje własności Handle. To subtelne, nie zawsze możesz powiedzieć. Posiadanie takiego kodu w konstruktorze jest niezdrowe, okno zostaje utworzone przed ukończeniem konstruktora. Zwykle kończy się dobrze, ale może sprawić, że tworzenie formularza będzie bardzo powolne. Łatwe do zdiagnozowania z okna Call Stack.
  • Aby uniknąć błędu w implementacji MDI. Jeśli utworzysz dziecko MDI w konstruktorze macierzystym, otrzymasz zduplikowane glify widoczne po zmaksymalizowaniu potomka. Zamiast tego utwórz dziecko w aplikacji OnLoad.
+0

Zatrzymaj mnie, jeśli się mylę, ale bardziej "poprawne" jest użycie 'OnLoad()', ale musiałbym być świadomy faktu, że kod nie będzie dostępny dla innej klasy. Poprawny? –

+0

To * jest * dostępne dla klasy pochodnej, base.OnLoad(). Pomijanie inicjalizacji klasy bazowej prawie zawsze byłoby błędne. * Kolejna * klasa nie ma biznesu z kodem w Load/OnLoad. –

+0

Tak więc jeśli klasa pochodna nazywa 'OnLoad()', uruchomiłaby 'base.OnLoad()', a następnie dowolny kod, który po tym umieściłem. –

0

podnosi Załaduj zdarzeń, które obsługuje . Zobacz .

W swoim kodzie na końcu funkcji inicjującej można wywołać funkcję OnLoad. Klasa bazowa następnie wywoła procedury obsługi zdarzeń (w tym przypadku), które mogły zostać ustawione w kodzie inicjującym.

Osobiście umieściłbym mój kod w numerze Form_Init i pozostawiłbym OnLoad dla inicjowania zdarzenia, ponieważ obsługuję to zdarzenie, chociaż możesz bronić z uzasadnionego powodu, jak widzisz w swoich odpowiedziach.

+0

mogę być gęste, ale myślę, potwierdzasz to, co powiedziałem na temat OnLoad, wywołując ładunek, ale czy to odpowiada na moje pytanie o to, w którym powinienem umieścić mój kod? Wydaje mi się, że mogę to zrobić z równym skutkiem tak długo, jak po wywołaniu 'base.OnLoad (e)'. –

+2

Ta odpowiedź nie odpowiada na pytanie, które nie dotyczy: * wywołania * "OnLoad", ale tego, czy * nadpisania * go. – reinierpost

2

Podczas przesłuchiwania OnLoad wywołanie base.OnLoad wywołuje Load - niepożądanie formularza.

protected override void OnLoad(EventArgs e) 
{ 
    // do stuff before Load-event is raised 
    base.OnLoad(e); 
    // do stuff after Load-event was raised 
} 

Jeśli nie specjalnie trzeba wykonywać rzeczy przed obciążenia zdarzenie jest wywoływane, umieszczając kod w OnLoadpobase.OnLoad(e) daje takie samo zachowanie wykonania jak umieszczenie go w uchwycie zdarzeń.

Polecam zastąpić metodę zamiast subskrybować wydarzenie.

+0

Dziękuję za odpowiedź, ale brzmi to tak, jak mówisz, że nie ma ostatecznej odpowiedzi na moje pytanie poza terminem wypełnienia formularza, prawda? –

+1

Osobiście przesłonię metodę OnLoad, ponieważ jest to typowe podejście do tworzenia dziedziczonych klas. Zdarzenia te, jak wspomniał Hans Passant, przeznaczone są dla innych klas, które mogą je zapisać. Ale w praktyce nie ma prawdziwej różnicy. – bernhof