2010-09-08 22 views
24

Me gustaría que alguien lo intente y explique la diferencia entre estos. Más específicamente, ejemplos de escenarios de uso.Form_Load() 'event' o Override OnLoad()

Estoy refactorización algunos de Windows Forms código y un Form tiene algún código en el evento Form_Load() y también en un evento protected override void OnLoad() que llama base.OnLoad(e); Ahora he trazado y los fuegos Ignorar primera e inmediatamente dispara la versión evento.

Entonces, ¿cuál se usa normalmente y por qué?

+0

ver también https://stackoverflow.com/questions/2521322/what-setup-code-should-go-in-form-constructors-versus-form-load-event – DaveInCaz

Respuesta

23

Siempre debe anular OnLoad(). El uso del evento solo es apropiado cuando otra clase estaría interesada en el evento. Para qué son los eventos. Otra clase interesada en el evento Load es muy rara, solo muy útil para hacer arreglos de ventanas.

Aún así, el evento Load funciona bien con el diseñador y los programadores VB6 se sienten muy cómodos con él. No es terriblemente incorrecto, solo te meterías en problemas cuando comiences a heredar el formulario y el código no se ejecute en el orden correcto.

La mayoría del código que ahora se pone en el evento Load realmente pertenece al constructor. Solo necesita OnLoad si:

  • Necesita conocer el tamaño y la posición exactos de la ventana. Lo mejor es OnLoad, se crea el identificador de ventana y se aplican las preferencias del usuario (tamaño de título y borde) y el formulario se volvió a escalar como lo indica la propiedad Form.AutoScaleMode. La ventana aún no está visible, es un buen momento para mover la ventana a otra parte o para organizar los controles secundarios.
  • Tiene un código que necesita la propiedad Manejar. Esto es sutil, no siempre se puede decir. Tener un código como ese en el constructor no es saludable, la ventana se crea antes de que se complete el constructor. Por lo general, llega a un buen final, pero puede hacer que la creación de la forma sea muy lenta. Fácil de diagnosticar desde la ventana Pila de llamadas.
  • Para evitar un error en la implementación de MDI. Si crea un elemento secundario MDI en el constructor padre, obtendrá glifos duplicados, visibles cuando maximice el elemento secundario. Cree el hijo en OnLoad en su lugar.
+0

Entonces, deténganme si me equivoco, pero es más "correcto" usar 'OnLoad()', pero tendría que ser consciente del hecho de que el código allí no estaría disponible para otra clase. ¿Correcto? –

+0

It * is * disponible para una clase derivada, base.OnLoad(). Omitir la inicialización de la clase base casi siempre sería incorrecto. * Otra clase * no tiene nada que ver con el código en Load/OnLoad. –

+0

Entonces, si una llamada de clase derivada 'OnLoad()' dispararía 'base.OnLoad()' y luego cualquier código que puse después de eso. –

0

OnLoad plantea el evento Cargar, que maneja. Vea el .

Por lo tanto, en su código, al final de su función de inicialización, puede llamar a la función OnLoad. La clase base llamará a los controladores de eventos (en este caso), que puede haber configurado en su código de inicialización.

Personalmente, me gustaría poner mi código en el Form_Init y dejar OnLoad para iniciar el evento, ya que estoy controlar el evento, aunque se puede defender ya sea por una buena razón, como se ve a partir de sus respuestas.

+0

puedo ser denso, pero creo está confirmando lo que dije sobre OnLoad llamando al Evento de Carga, pero ¿esto responde mi pregunta sobre cuál debería colocar mi código? Me parece que puedo ponerlo con igual efecto siempre que sea después de la llamada 'base.OnLoad (e)'. –

+2

Esta respuesta no aborda la pregunta, que no trata sobre si * llamar * 'OnLoad' sino sobre * anular * it. – reinierpost

2

Al reemplazar OnLoad, la llamada a base.OnLoad invoca el Load -Evento del formulario.

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

Si usted no necesita específicamente para realizar las cosas antes de la carga-evento se produce, colocar el código en OnLoaddespuésbase.OnLoad(e) da el mismo comportamiento en tiempo de ejecución como de colocarlo en el controlador evento.

Recomendaría anular el método en lugar de suscribirse al evento.

+0

Gracias por la respuesta, pero parece que usted dice que no hay una respuesta definitiva a mi pregunta más allá del momento en que se carga el formulario, ¿correcto? –

+1

Yo personalmente anularía el método OnLoad, ya que este es el enfoque típico al crear clases heredadas. Los eventos son, como lo menciona Hans Passant, destinados a otras clases que pueden suscribirse a estos. Pero en la práctica no hay diferencia real. – bernhof