2010-06-23 5 views
3

J'ai un tas de contrôles sur un formulaire et tous leurs événements de «changement» pointent vers le même gestionnaire d'événements. Certains d'entre eux sont TextChanged de txtInput1, de chkOption1 CheckedChanged et de cmbStuff1 SelectedIndexChanged. Voici le gestionnaire d'événements:Comment puis-je déterminer si un événement a été déclenché par une action utilisateur ou par un code?

private void UpdatePreview(object sender, EventArgs e) 
{ 
    // TODO: Only proceed if event was fired due to a user's clicking/typing, not a programmatical set 
    if (sender.IsSomethingThatTheUserDid) // .IsSomethingThatTheUserDid doesn't work 
    { 
     txtPreview.Text = "The user has changed one of the options!"; 
    } 
} 

Je voudrais l'instruction if pour exécuter uniquement lorsqu'un utilisateur modifie le texte de texte ou clique sur une case à cocher ou autre. Je ne veux pas que cela se produise si le texte ou la case à cocher a été modifié par une autre partie du programme.

+0

Je pourrais jurer que je viens de répondre à une question exactement comme ça récemment ... –

+1

La voici. Ce n'est pas exactement un doublon complet, mais la réponse est toujours la même: http://stackoverflow.com/questions/3071811/listbox-selectedindexchanged-can-you-determine-if-it-was-user-intiated/3071856 –

+0

Can vous clarifiez ce que vous voulez dire lorsque vous dites "Je ne veux pas que cela se produise si le texte ou la case à cocher a été modifié par une autre partie du programme". – Doug

Répondre

9

Il n'y a pas de mécanisme intégré pour cela. Vous pouvez cependant utiliser un drapeau.

bool updatingUI = false; 

private void UpdatePreview(object sender, EventArgs e) 
{ 
    if (updatingUI) return; 

    txtPreview.Text = "The user has changed one of the options!"; 
} 

Ensuite, lorsque vous mettez à jour l'interface utilisateur de votre code:

updatingUI = true; 

checkBox1.Checked = true; 

updatingUI = false; 

Si vous voulez plus de la solution-ingénieur, vous pouvez utiliser quelque chose comme ceci:

private void UpdateUI(Action action) 
{ 
    updatingUI = true; 

    action(); 

    updatingUI = false; 
} 

Et l'utiliser comme ceci:

UpdateUI(()=> 
{ 
    checkBox1.Checked = true; 
}); 
+0

Merci, je supposais juste qu'il y avait un mécanisme intégré pour le faire. Je vais utiliser un drapeau. De plus j'ai appris quelque chose de nouveau avec la syntaxe dans ton dernier bloc de code :) – Coder7862396

+0

@Coder: C'est ce qu'on appelle une expression lambda. Vous devriez trouver beaucoup d'informations à leur sujet. Bonne chance! –

-1

Vous ne pouvez pas simplement vérifier l'expéditeur? S'il est appelé d'un événement câblé à un contrôle d'interface utilisateur, il reviendra avec le contrôle. Si vous tirer de l'événement à partir du code, ce sera soit l'élément faisant l'appel, ou vous pouvez faire tout ce que vous voulez:

private void SomewhereElse() 
{ 
    UpdatePreview(null, new EventArgs()); 
} 

private void UpdatePreview(object sender, EventArgs e) 
{ 
    if (sender == null) 
    { 
     txtPreview.Text = "The user has changed one of the options!"; 
    } 
} 

ou vous pouvez être en mesure de le faire:

private void UpdatePreview(object sender, EventArgs e) 
{ 
    if (!(sender is Control)) 
    { 
     txtPreview.Text = "The user has changed one of the options!"; 
    } 
} 
+0

Ceci est incorrect. L'expéditeur est toujours l'objet qui déclenche l'événement. Que la propriété 'Text' ait été modifiée par entrée ou par code, la variable' sender' sera toujours l'instance de la zone de texte qui a déclenché l'événement. –

+0

Ce n'est pas "UpdatePreview()" qui est appelé d'ailleurs, c'est le réglage du texte ou de la case à cocher (txtInput1.Text = "Bonjour d'ailleurs") – Coder7862396

+0

@Adam - Ceci est incorrect du point de vue de la réponse affichée question. J'avais mal lu ce qu'il essayait de faire. Ma réponse est correcte dans le contexte que j'ai posté. @ Coder7862396 - Vous avez absolument raison. J'ai manqué cela dans l'affichage original. – Robaticus

Questions connexes