Comment distinguer l'utilisateur vs changements de programme dans WinForms CheckBox?
-
25-09-2019 - |
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?
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");
}