Comment ajouter un événement à un UserControl en C#?

J'ai un UserControl qui contient 3 étiquettes. Je veux ajouter un événement pour cela, qui se produit lorsque le texte de l'une des étiquettes a changé.
J'utilise Visual Studio 2010

24
demandé sur shA.t 2010-08-15 09:51:56

6 réponses

Tout d'abord, vous devez déclarer l'événement dans votre classe (à côté de vos méthodes et constructeurs):

public event EventHandler LabelsTextChanged;

Ensuite, vous devez créer une méthode pour gérer les étiquettes individuelles' TextChanged événements.

private void HandleLabelTextChanged(object sender, EventArgs e)
{
    // we'll explain this in a minute
    this.OnLabelsTextChanged(EventArgs.Empty);
}

Quelque part, probablement dans le constructeur de votre contrôle, vous devez vous abonner aux événements TextChanged de l'étiquette.

myLabel1.TextChanged += this.HandleLabelTextChanged;
myLabel2.TextChanged += this.HandleLabelTextChanged;
myLabel3.TextChanged += this.HandleLabelTextChanged;

Maintenant pour la méthode HandleLabelsTextChanged. Nous pourrions soulever LabelsTextChanged directement; cependant, les directives de conception. NET framework disent que c'est une meilleure pratique pour créer un OnEventName méthode virtuelle protégée pour soulever l'événement pour nous. De cette façon, les classes héritées peuvent "gérer" l'événement en remplaçant la méthode OnEventName, qui s'avère avoir un peu de meilleures performances que de s'abonner à l'événement. Même si vous pensez que vous ne remplacerez jamais la méthode OnEventName, c'est une bonne idée de prendre l'habitude de le faire de toute façon, car cela simplifie le processus de levée d'événements.

Voici notre OnLabelsTextChanged:

protected virtual void OnLabelsTextChanged(EventArgs e)
{
    EventHandler handler = this.LabelsTextChanged;
    if (handler != null)
    {
        handler(this, e);
    }
}

Nous devons vérifier null car un événement sans les abonnés est null. Si nous essayions de déclencher un événement nul, nous obtiendrions un NullReferenceException. Notez que nous copions EventHandler de l'événement dans une variable locale avant de le vérifier pour null et de déclencher l'événement. Si nous l'avions plutôt fait comme ceci:

if (this.LabelsTextChanged != null)
{
    this.LabelsTextChanged(this, e);
}

Nous aurions une condition de course entre le contrôle de nullité et la levée de l'événement. S'il se trouve que les abonnés à l'événement se sont désabonnés juste avant que nous ayons soulevé l'événement, mais après avoir vérifié la valeur null, une exception serait jetée. Vous n'avez normalement pas rencontrer ce problème, mais il est préférable de prendre l'habitude de l'écrire de façon sécuritaire.

Edit: Voici comment le public event EventHandler LabelsTextChanged; ligne doit être placé:

namespace YourNamespace
{
    class MyUserControl : UserControl
    {
        // it needs to be here:
        public event EventHandler LabelsTextChanged;

        ...
    }
}

Voici les lignes directrices de conception du cadre sur la conception d'événements pour plus de lecture.

49
répondu Zach Johnson 2010-08-15 06:43:10

Vous devez d'abord déclarer un événement dans votre usercontrol par exemple:

public event EventHandler TextOfLabelChanged;

Ensuite, vous devez appeler la fonction de rappel qui est liée à votre événement (s'il y en a) dans l'exécution.Vous pouvez le faire en manipulant L'événement TextChanged d'une étiquette comme ceci:

public void LabelTextChanged(object sender,EventArgs e)
{
if(TextOfLabelChanged!=null)
TextOfLabelChanged(sender,e);
}

Vous pouvez avoir votre propre objet EventArgs si vous le souhaitez.

Quelque part dans votre code, vous devez lier votre événement label TextChanged à cette méthode comme ceci:

_myLabel.TextChanged+=LabelTextChanged;
3
répondu Beatles1692 2010-08-15 05:59:27

Erreur de compilation, qui dit: "Classe attendue, délégué, enum, interface ou struct" sur la deuxième ligne, il semble avoir un problème avec "event...


Ces 2 lignes doivent être à l'intérieur de la déclaration de classe.

public delegate void TextChangedEventHandler(object sender, EventArgs e);
public event TextChangedEventHandler LabelTextChanged;
1
répondu Vince 2011-05-01 01:37:02

Il y a un moyen très simple de le faire!

Sur le formulaire UserControl:

  1. changer les propriétés en public pour accéder partout

Sur le formulaire principal , où vous utilisez UserControl:

.5: dans la Région using Ajouter using userControl1=UserControl.userControl1

1.Ajoutez l'événement' Laod ' à votre UserControl:

this.userControl1.Load += new System.EventHandler(this.userControl1_Load);

2.In le userControl1_Load:

private void userControl1_Load(object sender, EventArgs e)
{
     (sender as UserControl1).label1.TextChanged += label1_TextChanged; 
     //add a 'TextChanged' event to the label1 of UserControl1 
     OR use direct cast:
     ((UserControl1) sender).label1.TextChanged += label1_TextChanged;

}

3.In th label1_TextChanged:

 private void label1_TextChanged(object sender, EventArgs e)
 {
     //do whatever you want
 }
1
répondu AliTheOne 2014-07-03 18:53:56
public delegate void TextChangedEventHandler(object sender, EventArgs e);
public event TextChangedEventHandler LabelTextChanged;

// ...

protected void MyTextBox_TextChanged(object sender, EventArgs e)
{
    if (LabelTextChanged != null) {
        LabelTextChanged(this, e);
    }
}
0
répondu thelost 2010-08-15 05:56:38

, Vous devez être de déclarer les event et delegate dans le Namespace. Essayez d'amener le code dans la portée class. Cela fonctionnera correctement.

0
répondu prem 2012-11-16 07:45:02