Question

Je logique sur un événement OnCheckedChanged de CheckBox qui se déclenche sur la forme de charge, ainsi que lors des changements de l'utilisateur de vérifier l'état. Je veux la logique d'exécuter uniquement sur l'action de l'utilisateur.

Y at-il un moyen de détecter lisse utilisateur vs changement de programmation qui ne repose pas sur le réglage / vérification de variables utilisateur?

Était-ce utile?

La solution

Je suis généralement un drapeau bool sur ma forme que je mis à true avant de changer de programmation des valeurs. Ensuite, le gestionnaire d'événements peut vérifier que le drapeau pour voir si elle est un utilisateur ou programmatique.

Autres conseils

Essayez une bonne vieille réflexion?

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

La pile d'appel va comme ceci:

  • OnClick
  • set_Checked
  • OnCheckChanged

Vous devez revenir en arrière 3 pour différencier qui REGLER Vérifié

Rappelez-vous cependant, il y a des choses qui peuvent gâcher avec la pile d'appel, ce n'est pas fiable à 100%, mais vous pouvez étendre cela un peu à la recherche de la source d'origine.

Je l'ai essayé et cela a fonctionné.

        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");
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top