Pregunta

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        if (MessageBox.Show(this, "Do you really want to close?", "Close?", 
                            MessageBoxButtons.YesNo) == DialogResult.No)
        {
            e.Cancel = true;
        }
    }
}

Así que cuando quiero cerrar la aplicación haciendo clic en el botón de cerrar el cuadro de mensaje se muestra como debe ser, entonces no he escogido. Entonces se ejecuta la línea e.Cancel = true y el formulario no está cerrado.

Ahora la cosa es, después de esto, si cierro la aplicación de administrador de tareas de la razón está cerca UserClosing !!! ¿Por qué? ¿No debería ser TaskManagerClosing?

¿Fue útil?

Solución

He encontrado un href="http://dotnet.itags.org/web-forms/86331/" rel="nofollow hilo con una respuesta por nuestro propio nobugz :

  Formas

Windows no puede detectar que el   Cerrar razón vino de la Tarea   Gerente. Por lo tanto, de forma automática   traduce a CloseReason.None   CloseReason.TaskManagerClosing.   El problema es que, una vez que se trató de cerrar   con la "X", la CloseReason es conjunto   a UserClosing y no reconfiguradas   Ninguna copia a si se cancela el cierre.   Descuidado.

Y junto a ella, una explicación por otro usuario sobre cómo cambiar el valor de e.CloseReason a Ninguno usando Reflexión (ya que es de sólo lectura), para trabajo en torno a este problema (esto se debe aplicar al establecer e.Cancel True):

FieldInfo fi = typeof(Form).GetField("closeReason", BindingFlags.Instance | BindingFlags.NonPublic);

fi.SetValue(this, CloseReason.None);

Otros consejos

Vea la respuesta a esta pregunta qué usos < a href = "http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx" rel = "nofollow noreferrer"> CloseReason.TaskManagerClosing para capturar la misma.

Al igual que la traducción del código en VB:

Imports System.Reflection
Private Sub ResetCloseReason()
  Dim myFieldInfo As FieldInfo
  Dim myType As Type = GetType(Form)
  myFieldInfo = myType.GetField("closeReason", BindingFlags.NonPublic Or _
                    BindingFlags.Instance Or BindingFlags.Public)
  myFieldInfo.SetValue(Me, CloseReason.None)

End Sub

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top