Pregunta

Tengo lógica en el evento OnCheckedChanged de una casilla de verificación que los incendios en carga forma, así como cuando el usuario cambia de verificación Estado. Quiero que la lógica sólo a ejecutar en la acción del usuario.

¿Hay una manera de detectar mancha vs cambio programático de usuario que no se basa en Configuración / Verificación variables de usuario?

¿Fue útil?

Solución

Por lo general tienen una bandera bool en mi forma que se establece en true antes de valores mediante programación cambiantes. A continuación, el controlador de eventos puede comprobar que la bandera para ver si es un usuario o mediante programación.

Otros consejos

Trate de alguna buena reflexión de edad?

StackFrame lastCall = new StackFrame(3);
if (lastCall.GetMethod().Name != "OnClick")
{
    // Programmatic Code
}
else
{
    // User Code
}

La pila de llamadas es la siguiente:

  • OnClick
  • set_Checked
  • OnCheckChanged

Así que hay que volver 3 diferenciar quienes SET Chequeado

Do recordar, sin embargo, hay algunas cosas que puede ensuciar con la pila de llamadas, no es fiable al 100%, pero se puede extender esta un poco para buscar la fuente de origen.

He intentado esto y funcionó.

        bool user_action = false;
        StackTrace stackTrace = new StackTrace();
        StackFrame[] stackFrames = stackTrace.GetFrames();
        foreach (StackFrame stackFrame in stackFrames)
        {
            if(stackFrame.GetMethod().Name == "WmMouseDown")
            {
                user_action = true;
                break;
            }
        }

        if (user_action)
        {
            MessageBox.Show("User");
        }
        else
        {
            MessageBox.Show("Code");
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top