Est-il possible d’exposer les événements d’un object membre d’une classe à l’extérieur dans .NET?

Dites que j’ai un contrôle utilisateur dans ASP.NET qui contient un bouton:

public class MyUserControl : UserControl { private Button btnSave = new Button(); } 

Je peux exposer toute propriété du bouton à l’extérieur en créant une propriété qui pointe sur le bouton:

 public ssortingng SaveButtonText { get { return btnSave.Text; } set { btnSave.Text = value; } } 

Alors je peux le faire pour définir le texte du bouton:

 MyControl.SaveButtonText = "hello world"; 

Existe-t-il une construction similaire que je peux utiliser pour exposer également les événements du bouton à l’extérieur? Quelque chose comme:

 public event SaveButtonClick { return btnSave.OnClick; } ... MyControl.SaveButtonClick += new EventHandler(...); 

Vous pouvez faire quelque chose comme ça, oui:

 public event EventHandler SaveButtonClick { add { btnSave.Click += value; } remove { btnSave.Click -= value; } } 

Notez cependant qu’il y a un inconvénient à cela: l’argument “sender” fourni aux gestionnaires d’événements restra le bouton de sauvegarde plutôt que votre contrôle … ce n’est peut-être pas ce que l’abonné attendait. Une autre approche consiste à vous abonner une fois au gestionnaire de clic du bouton de sauvegarde vous-même:

 public event EventHandler SaveButtonClick = delegate {}; private void OnSaveButtonClicked(object sender, EventArgs e) { // Replace the original sender with "this" SaveButtonClick(this, e); } ... btnSave.Click += OnSaveButtonClicked(); 

Cette approche présente également un inconvénient: vous obtenez en permanence une référence du bouton Enregistrer à “ceci”, ce qui peut avoir un impact sur la récupération de place. Fondamentalement, votre contrôle ne pourra pas être récupéré avant que le bouton de sauvegarde ne soit également éligible pour la récupération de place. Dans ce cas, je doute fort que ce soit un problème, mais il convient de le savoir.

  public event EventHandler SaveButtonClick { add { btnSave.Click += new EventHandler (value); } remove { btnSave.Click-= new EventHandler (value); } }