En .NET, los formularios de Windows tienen un evento que se dispara antes de que se cargue el formulario (Form.Load), pero no hay ningún evento correspondiente que se dispare DESPUÉS de que se haya cargado el formulario. Me gustaría ejecutar algo de lógica después de que se haya cargado el formulario.
¿Alguien puede aconsejar sobre una solución?
Respuestas:
Puede usar el evento "Mostrado": MSDN - Form.Shown
"El evento Mostrado solo se genera la primera vez que se muestra un formulario; posteriormente, minimizar, maximizar, restaurar, ocultar, mostrar o invalidar y volver a pintar no generará este evento".
fuente
Shown += Form1_Shown;
como se sugiere en otro hiloA veces uso (en carga)
o
(cambie "this" a su variable de formulario si está manejando el evento en una instancia que no sea "this").
Esto empuja la invocación al bucle de formularios de Windows, por lo que se procesa cuando el formulario está procesando la cola de mensajes.
[actualizado a pedido]
Los métodos Control.Invoke / Control.BeginInvoke están diseñados para usarse con subprocesos y son un mecanismo para impulsar el trabajo en el subproceso de la interfaz de usuario. Normalmente esto es utilizado por subprocesos de trabajo, etc. Control.Invoke hace una llamada síncrona, mientras que Control.BeginInvoke hace una llamada asíncrona.
Normalmente, estos se usarían como:
Lo hace al insertar un mensaje en la cola de mensajes de Windows; el subproceso de la interfaz de usuario (en algún momento) quita la cola del mensaje, procesa al delegado y le indica al trabajador que se completó ... hasta ahora todo bien ;-p
OKAY; Entonces, ¿qué sucede si usamos Control.Invoke / Control.BeginInvoke en el hilo de la interfaz de usuario? Hace frente ... si llama a Control. Invocar, es lo suficientemente sensible como para saber que el bloqueo en la cola de mensajes provocaría un punto muerto inmediato, por lo que si ya está en el hilo de la interfaz de usuario, simplemente ejecuta el código de inmediato ... para que no nos ayuda ...
Pero Control.BeginInvoke funciona de manera diferente: siempre empuja el trabajo a la cola, incluso si ya estamos en el hilo de la interfaz de usuario. Esto es una forma realmente simple de decir "en un momento", pero sin los inconvenientes de los temporizadores, etc. (¡que de todos modos tendrían que hacer lo mismo!).
fuente
La primera vez NO comenzará "AfterLoading",
simplemente lo registrará para iniciar NEXT Load.
fuente
Tuve el mismo problema y lo resolví de la siguiente manera:
En realidad, quiero mostrar el mensaje y cerrarlo automáticamente después de 2 segundos. Para eso tuve que generar (dinámicamente) una forma simple y una etiqueta que muestra el mensaje, detener el mensaje durante 1500 ms para que el usuario lo lea. Y cierre el formulario creado dinámicamente. El evento mostrado ocurre después del evento de carga. Entonces el código es
fuente
También puede intentar poner su código en el evento Activado del formulario, si desea que ocurra, justo cuando el formulario esté activado. Sin embargo, deberá realizar una comprobación booleana de "se ha ejecutado" si solo se supone que se ejecuta en la primera activación.
fuente
Esta es una pregunta antigua y depende más de cuándo necesita comenzar sus rutinas. Dado que nadie quiere una excepción de referencia nula, siempre es mejor verificar primero nulo y luego usar según sea necesario; eso solo puede ahorrarle mucho dolor.
La razón más común para este tipo de pregunta es cuando un contenedor o un tipo de control personalizado intenta acceder a propiedades inicializadas fuera de una clase personalizada donde esas propiedades aún no se han inicializado, lo que puede causar que se llenen valores nulos e incluso puede causar excepciones de referencia nulas en tipos de objeto. Significa que su clase se está ejecutando antes de que se haya inicializado por completo, antes de que haya terminado de configurar sus propiedades, etc. Otra posible razón para este tipo de preguntas es cuándo realizar gráficos personalizados.
Para responder mejor a la pregunta sobre cuándo comenzar a ejecutar el código después del evento de carga del formulario es monitorear el mensaje WM_Paint o conectarse directamente al evento de pintura en sí. ¿Por qué? El evento de pintura solo se activa cuando todos los módulos se han cargado completamente con respecto a su evento de carga de formulario. Nota: This.visible == true no siempre es cierto cuando se establece true, por lo que no se utiliza para este propósito, excepto para ocultar un formulario.
El siguiente es un ejemplo completo de cómo comenzar a ejecutar su código después del evento de carga del formulario. Se recomienda que no ate innecesariamente el bucle de mensajes de pintura, por lo que crearemos un evento que comenzará a ejecutar su código fuera de ese bucle.
espacio de nombres MyProgramStartingPlaceExample {
}
fuente
Sé que esta es una publicación anterior. Pero así es como lo he hecho:
fuente
Puede cerrar su formulario después de alguna ejecución.
//YourForm.ActiveForm.Close ();
fuente