2014-09-19 2 views
1

Je voudrais savoir comment créer des EventArgs personnalisés pour un gestionnaire d'événements existant.C# NumericUpDown.OnValueChanged, comment cela a-t-il été changé?

Disons que j'ai le contrôle NumericUpDown numericUpDown et que je veux un gestionnaire pour son événement OnValueChanged. Un double-clic pour ValueChanged en studio visuel fait snippet comme celui-ci

private void numericUpDown_ValueChanged(object sender, EventArgs e) 
{ 

} 

Cependant, je voudrais savoir comment il a été changé (comme +5, -4,7), mais EventArgs plaine n'a pas ces informations. Peut-être Decimal change = Value - Decimal.Parse(Text) ferait l'affaire (à cause du changement de texte retardé), mais c'est moche et peut ne pas fonctionner à chaque fois.

Je suppose que je devrais faire mes propres EventArgs comme celui-ci

class ValueChangedEventArgs : EventArgs 
{ 
    public Decimal Change { get; set; } 
} 

et en quelque sorte remplacer NumericUpDown.OnValueChanged événement pour générer mes EventArgs avec l'information appropriée.

+1

Pourriez-vous simplement stocker la valeur précédente du contrôle, puis la comparer à la valeur actuelle dans le gestionnaire d'événements? – APerson

+0

@APerson Si j'avais plus de contrôles de ce type en utilisant le même gestionnaire d'événements, je devrais stocker toutes les valeurs précédentes possibles pendant l'exécution complète. – Zereges

+0

Il n'y a pas de stockage intégré du contenu précédent. Si vous avez besoin de suivre cela pour calculer les changements de valeur, vous devrez le stocker vous-même. –

Répondre

2

Il peut être beaucoup plus facile de simplement marquer la dernière valeur.

private void numericUpDown1_ValueChanged(object sender, EventArgs e) { 
     NumericUpDown o = (NumericUpDown)sender; 
     int thisValue = (int) o.Value; 
     int lastValue = (o.Tag == null) ? 0 : (int) o.Tag; 
     o.Tag = thisValue; 
     MessageBox.Show("delta = " + (thisValue - lastValue)); 
    } 
+0

Eh bien, je n'ai pas pensé à utiliser un tag pour ça. Cela pourrait faire l'affaire, je vais probablement l'utiliser. Cependant, si je voulais utiliser des arguments d'événements personnalisés, comment ferais-je cela? – Zereges

+1

Juste un petit avertissement pour quiconque essaie de faire la même chose. '(int) o.Tag' lance' InvalidCastException', donc utilisez plutôt 'int.Parse (o.Tag.ToString())' ou 'Convert.ToInt32 (o.Tag)' – Zereges

0

Vous devez créer votre propre contrôle numérique vers le haut vers le bas qui étend la version .net, définir un type de délégué pour votre événement, puis cacher la propriété événement contrôles de base.

Délégué:

public delegate void MyOnValueChangedEvent(object sender, ValueChangedEventArgs args); 

Args événement Classe:

class ValueChangedEventArgs : EventArgs 
{ 
    public Decimal Change { get; set; } 
} 

Nouvelle classe NumericUpDown, cacher l'événement hérité de 'nouveau':

public class MyNumericUpDown : NumericUpDown 
{ 
    public new event MyOnValueChangedEvent OnValueChanged; 
} 

Regardez here pour obtenir des instructions sur la façon pour élever votre événement personnalisé, et here pour des informati sur la gestion des événements.

Questions connexes