2010-05-10 3 views
1

J'ai une logique sur l'événement OnCheckedChanged d'un CheckBox qui se déclenche au chargement du formulaire ainsi que lorsque l'utilisateur change d'état de vérification. Je veux que la logique ne s'exécute que sur l'action de l'utilisateur.Comment faire la distinction entre changements utilisateur et programmatique dans WinForms CheckBox?

Existe-t-il un moyen pratique de détecter les changements d'utilisateur par rapport aux programmations qui ne reposent pas sur la définition/vérification des variables utilisateur?

Répondre

0

J'ai généralement un indicateur bool sur mon formulaire que j'ai défini sur true avant de modifier les valeurs par programme. Ensuite, le gestionnaire d'événements peut vérifier cet indicateur pour voir s'il s'agit d'un utilisateur ou d'un programme.

+2

cs31415 a demandé une solution qui n'impliquait pas la définition d'une «variable utilisateur» – Aren

0

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:

  • Surclic
  • set_Checked
  • OnCheckChanged

Vous avez donc besoin de revenir 3 pour différencier qui REGLER Vérifié

Do rememb Cependant, il y a des choses qui peuvent gâcher la pile d'appels, ce n'est pas fiable à 100%, mais vous pouvez l'étendre un peu pour rechercher la source d'origine.

0

J'ai essayé ceci 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"); 
     } 
Questions connexes