2010-03-26 7 views
48

Para aplicaciones WinForms Me pregunto qué código de configuración debe ir en:¿Qué código de configuración debería ir en Constructores de formulario frente a evento Carga de formulario?

  • MainForm()

en contraposición a

  • MainForm_Load (object sender, EventArgs e)

¿Hay alguna guía de mejores prácticas aquí?

+2

Una tercera posibilidad es el evento Mostrado. He encontrado que algunas cosas como "this.Activate();", "this.BringToFront();" y "this.Focus();" tener una mejor oportunidad de trabajar allí que en el evento FormLoad. – RenniePet

+1

Posible duplicado de [Winforms Form Constructor vs Load event] (http://stackoverflow.com/questions/264396/winforms-form-constructor-vs-load-event) –

+0

ver también https://stackoverflow.com/questions/ 3670806/form-load-event-or-override-onload – DaveInCaz

Respuesta

65

Los programadores que han trabajado con VB6 tienden a poner un montón de código en el evento Load, en VB6 ese evento se utilizó para inicializar el formulario. Pero eso ya no es apropiado en Windows Forms, la clase Form puede tener un constructor. La forma .NET es inicializar objetos de clase en el constructor, hay muy pocos motivos convincentes para no hacerlo para la clase Form.

El evento Load se ejecuta justo después de que se creó el identificador de ventana para el formulario, justo antes de que sea visible para el usuario. Solo debe escribir código en el controlador de eventos que depende de que se cree el identificador. No hay una carga de código que califique para este requisito excepto un tipo: código que requiere que se conozca el tamaño y la ubicación de la ventana.

Los valores de propiedades de Tamaño y Ubicación de un Formulario en tiempo de diseño no son los mismos que sus valores reales cuando el formulario se ejecuta en otra máquina. El formulario puede obtener una nueva escala para acomodar el tamaño de fuente del sistema o la configuración DPI del adaptador de video en la máquina de destino. Las preferencias del usuario juegan un papel también, el usuario puede haber seleccionado un tamaño de fuente diferente para el título de la ventana. Por lo general, no se preocupa por nada de esto, a menos que desee que la ventana tenga una posición particular en el escritorio o que esté alineada con alguna otra ventana.

Escribir código en el evento Load que hace cosas como inicializar los controles TreeView o ListView realmente puede ralentizar drásticamente el tiempo de inicio. Cuando lo haces en el constructor, Windows Forms no tiene que actualizar la ventana física todavía, aún no se ha creado. Una vez que se crea el control nativo, Winforms lo inicializa con una actualización masiva en lugar de un nodo/elemento a la vez, como ocurrirá cuando el código se ejecute en el evento Load. Gran diferencia.

Por último pero no menos importante: nunca debe usar el evento Load, debe anular el método OnLoad().Esto garantiza que el código se ejecuta en un orden predecible cuando usted (u otra persona) hereda de su clase de formulario. IntelliSense le ayuda a escribir este método, solo escriba "onl protegido" y presione tab para que IntelliSense complete automáticamente el método. Tenga en cuenta cómo puede elegir poner el código antes o después de la llamada base.OnLoad(), así es como controla quién es el jefe. Eres el jefe cuando lo pones, por lo general no es la elección correcta por cierto.

+6

Excelente información gracias, pero en el último punto, ¿por qué Microsoft nos da el evento de carga para usar fácilmente en VS si uno realmente debe reemplazar a OnLoad? – Greg

+10

Para alentar a los programadores a migrar a .NET hace 8 años, ese era el modelo de programación familiar . Anular OnLoad también es realmente fácil, IntelliSense realiza el 80% del trabajo cuando comienza a escribir. Pero se necesita escribir en lugar de hacer clic. Desafortunadamente, "fácil de usar" no siempre significa "correcto de usar". –

+0

Es bueno saber que (a diferencia de algunos otros frameworks que he usado) en Winforms puedes inicializar controles en el constructor. Funciona un placer – Stewart

8

echar un vistazo rápido al Use Constructor in Windows Forms to Ensure Proper Initialization

utilizar el constructor en un formulario Windows de asegurar que la inicialización se se hace correctamente. La orden de activación del evento es no es una ciencia exacta, y no puede depender siempre del orden en que se desencadenan los eventos , independientemente de lo que haya visto en el pasado.

....

Por esta razón, Microsoft recomienda que manejar código de inicialización en los formularios constructor, suponiendo que no lo hacen tienen una inicialización realmente el tiempo-comsuming que podría conseguir tiempo- en rodajas o hacer un DoEvents().

+0

@astander: ¿puede decir lo que significa este texto por "inicialización"? Por ejemplo, ¿significa cargar datos de una base de datos para mostrar en controles de formulario? –

+0

Yo diría que sí, y la inicialización de controles, clases, etc., como se puede ver en la llamada * InitializeComponent(); * en formularios estándar. Como se menciona aquí, tenga cuidado con las inicializaciones de larga ejecución, que el usuario podría llamar cuando lo necesite y mostrar ** Por favor, espere ** o algo por el estilo ... –

+4

"Por esta razón, Microsoft recomienda que maneje el código de inicialización en el Constructor de Formas "- sería bueno tener una fuente para esta recomendación. – Joe

Cuestiones relacionadas