2010-10-12 45 views
6

Tengo un controlador de eventos de clic de botón con el siguiente pseudocódigo:C# ¿Por qué form.Close() no cierra el formulario?

private void btnSave_Click(object sender, EventArgs e) 
{ 
    if(txt.Text.length == 0) 
    this.Close(); 
    else 
    // Do something else 

    // Some other code... 
} 

Esto es sólo un código simple, pero el punto es, cuando la longitud del texto es igual a cero, quiero cerrar el formulario. Pero en lugar de cerrar el formulario, el código ejecuta la parte // Algún otro código. Después de que el controlador de evento click se ejecuta por completo, el formulario se cierra.

sé, cuando coloco return justo después this.Close() forma se cerrará, pero me gustaría saber por qué la forma no es direclty de cerrado cuando se llama this.Close(). ¿Por qué se ejecuta el resto del controlador de eventos?

Respuesta

11

El resto del controlador de eventos se ejecuta porque no abandonó el método. Es tan simple como eso.

Llamar a this.Close() no "borra" inmediatamente el formulario (y el controlador de eventos actual). El recolector de basura recogerá el formulario más adelante si ya no hay más referencias al formulario.

this.Close() no es más que una llamada a un método normal, y a menos que el método arroje una excepción, permanecerá en el contexto de su método actual.

+0

Pero, intuitivamente, me gustaría excepto que cuando llame a this.Close() se cerrará el formulario, pero este no es el caso. Gracias por la aclaración. – Martijn

+0

@Martijn: ¿Entonces el formulario permanece abierto y no cierra en absoluto? ¿Puedes mostrar qué está haciendo "algún otro código" entonces? ¿O puedes publicar una muestra simple que muestre ese comportamiento? –

+0

@ 0x3a: Incorrecto. El formulario ejecuta todo el código en el controlador de eventos y luego cierra el formulario. Ya has respondido mi pregunta :) Me preguntaba por qué 'Close()' no destruye la forma en el momento en que se llama 'Close()'. – Martijn

3

La respuesta es simple ya que está ejecutando su método actual por lo que this.Close() se pondrá en cola hasta que devuelva explícitamente o su método actual de excitación arroje una excepción.

4

Cerrar solo oculta el formulario; el formulario todavía está activo y no recibirá otro evento de carga si lo muestra nuevamente.

Para eliminarlo de la memoria, utilice Eliminar().

+4

No, esto no es correcto. 'Form.Close()' eliminará el formulario, es decir, llama al método 'Dispose'. –

+1

No exactamente, si el formulario es un cliente MDI y es invisible, Cerrar no lo hará. O si el formulario es un cuadro de diálogo (se llama ShowDialog), tampoco desechará. – vulkanino

+0

Cuando uso 'Dispose()' en lugar de 'Close()' el resto del código aún se ejecuta. – Martijn

2

Otra solución posible es que si se abre un nuevo formulario y desea cerrar el actual: si se utiliza en lugar de newForm.ShowDialog()newForm.Show() que no se cierra la currentForm con currentForm.Close() hasta que el Newform también está cerrado.

+0

Al cerrar el formulario con' this.Close() ', observe si el formulario actual se muestra usando' f.ShowDialog(); 'devolverá' DialogResult .Cancel'. En el formulario de diálogo (llamado), he agregado 'this.Close(); this.Dispose (true); '. ¡Ahora parece que este diálogo finalmente se está cerrando! \ o / –

0

A menos que el formulario sea un formulario modal (abierto con .ShowDialog()), Form.Close() también elimina el formulario. Entonces, no puedes volver a abrirlo bajo ninguna circunstancia después de eso, a pesar de lo que otros hayan dicho. Hay Form.Visible para este comportamiento (ocultar/mostrar el formulario).

El punto aquí es que .Close() no regresa de la sección por la que se llama por varias razones. Por ejemplo, puede llamar a SomeForm.Close() desde otra forma o clase o lo que sea.

Cerrar() es solo un método como cualquier otro. Debe regresar explícitamente desde un método que llame a Close() si esto es lo que desea.

0

Llamar a MessageBox.Show (frmMain, "un mensaje", "un título") agrega el formulario "TextDialog" a la colección de formularios Application.OpenForms() de la aplicación, junto al formulario principal frmMain. Permanece después de cerrar el Messagebox.

Cuando esto sucede y se llama al botón Aceptar delegar para cerrar el formulario principal, la llamada a frmMain.Close() no funcionará, el formulario principal no desaparecerá y el programa no terminará como lo hará normalmente después de salir del OK delegar. Solo Application.Exit() cerrará todos los mensajes de basura "TextDialog" s.

Cuestiones relacionadas