cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 août 2008
-
11 janv. 2007 à 12:18
cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 août 2008
-
11 janv. 2007 à 17:51
Bonjour,
j'ai une classe qui doit réagir à un certains nombre d'événements d'un certain type. J'aimerais que l'utilisateur de la classe puisse ajouter lui même ces événements.
Je pensais à une classe comme çà :
public class Class1
{
//liste des événements auquel la classe doit régir
private List<EventHandler> _Events = new List<EventHandler>();
public Class1(EventHandler e)
{
//au moins un événement dans _Events.
_Events.Add(e);
}
//inscrit "Method" pour chaque événement
public void ManageEvents()
{
foreach (EventHandler e in _Events)
e + = new EventHandler(Method);
}
//traite les événements
public void Method(object sender, EventArgs e)
{
}
public List<EventHandler> Events
{
get { return _Events; }
}
}
Mais je rencontre 2 problèmes :
- Le premier à mon avis est insolvable : l'utilisateur ne peux ajouter que des événements qu'il à lui même définit. On ne pourra pas écrire : maClasse.Events.add(button1.Click). Je me trompe ?
- e += new EventHandler(Method); produit une erreur car e est en lecture seule. Savez-vous comment résoudre ce problème ?
dgouttegattat
Messages postés129Date d'inscriptionmardi 22 novembre 2005StatutMembreDernière intervention30 décembre 20073 11 janv. 2007 à 16:46
Je corrige un léger détail dans mon exemple de code précédent:
<hr />// si je veux que ma classe réagisse à button1.Click
button1.Click += new EventHandler(maClasse.Method);
// si je veux qu'elle réagisse à textBox.LostFocus
textBox.LostFocus += new EventHandler(maClasse.Method);
// etc, etc<hr />
Cela implique bien sûr que la méthode MaClasse.Method soit publique.
cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 août 2008 11 janv. 2007 à 14:54
merci SharpMao, ça semble marcher.
Par contre pourquoi ça marche ? Pourquoi le fait de faire un fair plutôt qu'un foreach fait que les élément de ma liste sont aussi en écriture ?
sebmafate, non je ne veux pas attacher dynamiquement une méthode à un évènement. J'ai une classe qui fait certaines actions quand un événement se produit. J'aimerais que ces actions se déclanchent aussi quand il se produit d'autre événements (du même typ) définit par les utilisateurs de la classe. Pour celà je voudrait rajouter à la classe la possibilité de lui ajouter des événements auquel elle réagit. J'éspère avoir été clair.
Mathmax
Vous n’avez pas trouvé la réponse que vous recherchez ?
dgouttegattat
Messages postés129Date d'inscriptionmardi 22 novembre 2005StatutMembreDernière intervention30 décembre 20073 11 janv. 2007 à 16:22
Salut,
>Pourquoi le fait de faire un fair plutôt qu'un foreach fait que les élément de ma liste sont aussi en écriture ?
Il faudrait plutôt se demander pourquoi un foreach plutôt qu'un for fait que les éléments de la liste sont seulement en lecture. La réponse est... que les spécifications du langage C# disent qu'il en est ainsi. La variable que l'on manipule dans une boucle foreach est une copie en lecture seule de l'élement courant de la collection.
Pour ce qui est de l'autre question, j'ai l'impression que tu te compliques la vie. Si les utilisateurs de la classe veulent qu'elle réagisse à un évènement donné, il leur suffit d'abonner ta classe à l'évènement en question.
<hr />// si je veux que ma classe réagisse à button1.Click
button1.Click += new EventHandler(Method);
// si je veux qu'elle réagisse à textBox.LostFocus
textBox.LostFocus += new EventHandler(Method);
// etc, etc<hr />
De manière générale, dans le modèle de gestion des évènements (qui correspond à peu près au design pattern Observateur), c'est l'objet qui génère l'évènement qui conserve en interne une liste des méthodes à appeler lorsque l'évènement à déclencher, or il me semble que tu cherches à faire le contraire... à moins que tu aies une bonne raison de maintenir ta propre liste?
cs_mathmax
Messages postés403Date d'inscriptionvendredi 28 octobre 2005StatutMembreDernière intervention31 août 2008 11 janv. 2007 à 17:51
Tu as raison, dans mon cas c'est beaucoup plus simple et plus logique d'appeler les méthodes depuis les objets qui génère l'événement plutôt que de transmettre les événements à la classe.
Mathmax