2010-02-26 7 views
5

con C# WinForms VS2008cómo dejar de evento licencia de texto en forma de disparar cerca

Tengo un cuadro de texto en un formulario con un método que se llama desde el evento textBox1_Leave. El método toma los contenidos del cuadro de texto en cuestión y rellena otros cuadros de texto en función de los contenidos. Mi problema es que el usuario tiene el foco en el cuadro de texto y luego hace clic en el botón para cerrar el formulario (llamando a this.close) y luego el formulario no se cierra porque el evento textbox leave se activa. Si el cuadro de texto no tiene foco en el formulario cerca, el formulario se cierra correctamente.

Sin embargo, si un usuario cierra el formulario haciendo clic en el pequeño icono de cerrar X en la esquina superior, se cierra todo el tiempo sin que se active el evento de dejar cuadro de texto.

¿Cómo puedo duplicar la funcionalidad de cierre X para que siempre pueda cerrar el formulario sin que se active el evento textbox leave?

+0

Esto funciona muy bien para mí. http://stackoverflow.com/questions/2664639/cancel-leave-event-when-closing –

Respuesta

7

La solución más simple va a ser para comprobar que el control se centra en realidad antes de hacer el post-procesamiento - pero no puede hacerlo en el controlador Leave, porque el foco seguirá siendo en el cuadro de texto en ese punto.

En su lugar, debe mover su lógica al evento LostFocus, que no está en el diseñador. Vas a tener que cablear en tiempo de ejecución:

public class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     textBox1.LostFocus += new EventHandler(textBox1_LostFocus); 
    } 

    private void textBox1_LostFocus(object sender, EventArgs e) 
    { 
     if (closeButton.Focused) 
      return; 
     // Update the other text boxes here 
    } 
} 

El evento LostFocus sucede al fuego después de el nuevo control recibe el foco.

Aclaración - usted puede ser que encontrar que funciona al poner esta lógica en el caso Leave - si el foco se cambia por el ratón. Si usa el teclado en su lugar, obtendrá un comportamiento incorrecto. LostFocus es confiable en casos ambos - el control enfocado será siempre sea el "nuevo" control. Esto está documentado en MSDN: Order of Events in Windows Forms.

Por cierto, la razón por la que no está teniendo este problema con la "X roja" es que la X no es realmente un control que puede recibir el foco, es parte de la ventana. Cuando el usuario hace clic en eso, no está causando que el cuadro de texto pierda el foco y, por lo tanto, no está causando que el evento Leave se dispare.

+0

No estoy de acuerdo con el comentario sobre 'Leave' que da un comportamiento incorrecto, vea - http://msdn.microsoft.com/en-us/library/system.windows.forms.control.leave.aspx (por cierto, el parámetro centrado se cambia antes de que el control de recepción invoque 'Enter', que viene primero en el orden de eventos) –

+0

Dependiendo de la funcionalidad necesaria, también puede haber un problema con este enfoque. Si el botón de cerrar es el siguiente en el orden de las pestañas después del cuadro de texto, y el usuario presiona TAB para salir del cuadro de texto, esto mantendrá las actualizaciones que desee que ocurran, aunque así sea. –

+0

Me gustaría dar un vistazo y ver cómo es como gracias a todos por la entrada – Spooky2010

0

puede comprobar para ver qué control acaba de obtener el foco.

private void textBox1_Leave(object sender, EventArgs e) 
{ 
    if (btnClose.Focused) 
     return; 
    // go from here 
} 
+0

Estás cerca, pero el enfoque aún no ha cambiado en el evento 'Leave'. – Aaronaught

2

Otro enfoque: Utilice el evento de validación del cuadro de texto en lugar de dejarlo, luego cambie la propiedad CausesValidation del botón a falso. También deberá configurar el cuadro de texto para que no valide en el evento de clic del botón, por lo que el evento de validación no se activará cuando el formulario se cierre (gracias a @Powerlord para señalar esto).

private void button1_Click(object sender, EventArgs e) 
{ 
    this.textBox1.CausesValidation = false; 
    this.Close(); 
} 
1

También puede controlar el evento FormClosing y asegúrese de que el argumento e.Cancel no quede establecido en true por los acontecimientos de validación sobre los otros controles en el formulario. Creo que serán despedidos antes del evento FormClosing.

private void MainForm_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      if (e.CloseReason == CloseReason.UserClosing) 
      { 
       e.Cancel = false; 
       return; 
      } 
     } 
+0

enfoque limpio, como si^_ ^ – chad

0

¿Solo comprueba si el formulario que posee el cuadro de texto está descartando? Si se cierra, es desechable. Si está desechando, podrías simplemente terminar el molesto evento de 'dejar' sin hacer nada. No lo verifiqué y me perdonó, estoy ahogado en un proyecto mío y me estaba buscando a mí mismo, así que no creo que tenga tiempo para eso.

private void GuiltyTextBox_Leave(object sender, EventArgs e) { 
    Form formOwningTheTextBox=(Form)((Control)sender).TopLevelControl; 
    if (formOwningTheTextBox.Disposing || formOwningTheTextBox.IsDisposed) return; 
    ....... 
} 

Sólo creo que esto va a trabajar con el mínimo esfuerzo y quería enviar una respuesta rápida antes de reanudar la búsqueda mi propia respuesta.

0

Escribir siguiente línea de código en el evento de texto cuadro de permiso en la parte superior

if me.closing then 
return 
end if 
Cuestiones relacionadas