2010-11-15 18 views
1

Je fais une forme de fenêtres projet en C#, où je fis une classe LabelX qui hérite System.Windows.Forms.Label, puis ajouté une propriété Mass de type flotteurComment créer son propre gestionnaire d'événements?

Maintenant, ma question est de savoir comment puis-je gérer, lorsque la valeur de Mass est modifié.

par exemple:
Lorsque l'utilisateur ou entrer la valeur zeroless than zero
Je veux tirer un message qui "masse ne peut pas être nulle ou négative"

+0

Voulez-vous lancer une exception? Vous ne voudriez pas vous inscrire à un événement pour déterminer l'échec. –

+0

je veux déclencher un événement comme text_change dans l'étiquette –

+0

Droit mais si je suis le consommateur, je ne devrais pas avoir à enregistrer pour un événement modifié pour déterminer l'échec lors de la définition d'une propriété. Vous devriez lancer une exception dans le setter de la propriété ... new ArgumentOutOfRangeException ("La valeur doit être supérieure à zéro") par exemple ... –

Répondre

3

Si j'interprète cela correctement, il y a deux parties à cela. Tout d'abord, vous devez détecter les valeurs non valides et lancer des exceptions. Deuxièmement, vous devez déclencher un événement lorsque la propriété change. Cela peut être réalisé comme suit.

private float mass; 
public float Mass 
{ 
    get 
    { 
     return this.mass; 
    } 

    set 
    { 
     if (value <= 0.0F) 
     { 
      throw new ArgumentOutOfRangeException("Mass cannot be zero or negative."); 
     } 

     if (this.mass != value) 
     { 
      this.mass = value; 
      OnMassChanged(EventArgs.Empty); 
     } 
    } 
} 

public event EventHandler MassChanged; 

protected virtual void OnMassChanged(EventArgs args) 
{ 
    var handler = this.MassChanged; 
    if (handler != null) 
    { 
     handler(this, args); 
    } 
} 

Pour afficher un message si une entrée non valide est faite, vous devez mettre un bloc try \ catch autour de l'appel à mettre Mass et attraper le ArgumentOutOfRangeException.

+0

La logique dans votre bloc if est à rebours. Je pense que vous voulez IF (value <= 0.0f) lancer une nouvelle exception (..); –

+0

@Babak: le corrige. Merci –

+0

erreur dans la ligne "vide virtuel privé OnMassChanged (Arguments EventArgs)" –

2

les opérations suivantes:

// Created an empty form with a LabelX control on it. 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    // Added this event from the property manager. 
    private void labelX1_MassChanged(object sender, EventArgs e) 
    { 
     var label = (LabelX)sender; 

     if (label.Mass <= 0.0) 
      MessageBox.Show("Mass is less than or equal to 0"); 
    } 
} 

public class LabelX : Label 
{ 
    private float _mass; 

    public float Mass 
    { 
     get { return _mass; } 
     set 
     { 
      if (!value.Equals(_mass)) 
      { 
       _mass = value; 
       OnMassChanged(EventArgs.Empty); 
      } 
     } 
    } 

    public event EventHandler MassChanged; 

    protected virtual void OnMassChanged(EventArgs e) 
    { 
     if (MassChanged != null) 
      MassChanged(this, e); 
    } 
} 
1

En dehors de votre classe LabelX, créez la classe suivante:

public class MassChangedEventArgs : EventArgs 
{ 
    public float Mass { get; private set; } 

    public MassChangedEventArgs(float mass) 
    { 
    this.Mass = mass; 
    } 
} 

également en dehors de votre classe LabelX, créez le délégué suivant. Ce sera votre gestionnaire d'événement.

public delegate void MassChangedEventHandler(object sender, MassChangedEventArgs e); 

Au sein de votre classe LabelX, créer un événement pour diffuser:

public class LabelX 
{ 
    public event MassChangedEventHandler MassChanged; 
    //the rest of your code here... 
} 

Vous aurez également besoin de créer une méthode d'instance privée qui déclenche votre événement. Enfin, lorsque votre propriété Mass change, appelez OnMassChanged. Par exemple:

public class LabelX 
{ 
    private float mass; 
    public float Mass 
    { 
     get 
     { 
     return mass; 
     } 
     set 
     { 
     mass = value; 
     OnMassChanged(); 
     } 
    } 

    public event MassChangedEventHandler MassChanged; 

    private void OnMassChanged() 
    { 
     if(MassChanged!=null) 
      this.MassChanged(this, new MassChangedEventArgs(this.Mass)); 
    } 

    //the rest of your code here... 
} 

Lorsque vous voulez gérer cet événement sur une base par exemple, il vous suffit d'enregistrer un écouteur à l'événement MassChanged de votre objet sous-jacent et effectuer toutes les actions nécessaires.

+0

Pourquoi créer un délégué pour cela? Je crée uniquement un délégué lorsque 'EventArgs' porte un état qui ne peut pas être récupéré autrement ou que j'ai besoin de communiquer des informations à l'expéditeur. Le 'Mass' peut être facilement récupéré en utilisant' (expéditeur ((LabelX)) .Mass'. N'est-ce pas préféré? –

+0

Il y a plusieurs façons de peler un chat. Mais, la raison de faire cela est de capturer l'état d'un objet au moment de l'invocation d'événement. Avec votre approche, la valeur de la propriété Mass peut très bien changer entre l'appel d'événement et le traitement du gestionnaire d'événements, ce qui entraîne une incohérence dans l'état. –

0

Les événements sont un modèle commun utilisé dans le cadre. Le processus implique généralement la définition d'un délégué à utiliser en tant que gestionnaires d'événements, la déclaration de l'événement à l'aide du gestionnaire, la définition de méthodes pour déclencher l'événement, puis l'accrochage aux propriétés de la logique pour déclencher l'événement.

Le message que vous décrivez est mieux fait en tant qu'exception, mais voici un exemple pour définir l'événement MassChanged. Ensuite, il suffit d'enregistrer les gestionnaires de l'événement et de partir de là.

0

Je suis certain que vous aimeriez 'déclencher' une exception dans votre cas. Ce plus d'un problème de logique de validation tel concept de contrats de code AOP.

Mais si vous aimez vraiment créer un événement pour ce que vous devez au moins: 1) créer une variable de stockage d'événement dans votre classe d'étiquettes

public event EventHandler MassChanged; 

2) dans votre propriété (notez que vous perdez la possibilité d'utiliser le code gen fonctions de C# 3 pour qui mettent en œuvre le champ « auto » pour stocker la valeur de votre propriété de masse)

public bool Mass 
     { 
      get { return _mass; } 
      set { 
        // check if value is invalid (0 or less) && that event subscribers exist 
        if(value<=0 && MassChanged != null) { MassChanged(this, null); } 
        else // otherwise assign ... 
        { 
        _mass = value; 
        }     

       } 
     } 

3) créer un gestionnaire d'événements de type EventHandler

Meilleur pour lire l'article msdn pour les événements: link text

Encore une fois je suis assez sûr que vous n'êtes pas correctement gérer les exceptions dans l'application si vous avez besoin d'un événement pour cela. Je veux dire qu'il n'y a rien de mal mais les événements ne sont généralement pas utilisés comme moyen de validation des valeurs.