2010-12-02 11 views
2

Imaginons que dans un contrôle personnalisé, j'ai défini un événement personnalisé myEvent. Maintenant, lors de l'événement, cet événement sera capturé par le formulaire parent.Comment un contrôle personnalisé Winform peut-il notifier un autre contrôle Winform personnalisé?

Comment puis-je capturer cet événement dans un autre contrôle personnalisé qui serait sur le même formulaire parent? Je voudrais que l'autre contrôle s'abonne au premier événement de contrôle en quelque sorte.

Répondre

3

J'ai souvent rencontré une situation similaire avec MVC. La façon dont j'aime le manipuler est d'utiliser un motif de conception de médiateur dans le contrôleur.

Fondamentalement, vous avez une classe qui a une fonction de registre et une fonction de notification. La fonction de registre prend un objet qui implémente une interface d'écoute et un messageId. Il stocke ceux-ci dans un dictionnaire. La fonction notify prend un messageId pour l'événement qui doit être envoyé aux écouteurs et notifie les événements appropriés que l'événement s'est produit.

peut-être donc quelque chose le long des lignes de

public interface IListener 
{ 
void MessageRaised(int messageId, params object[] arguments); 
} 

public class Mediator 
{ 
public void Register(IListener listener, int messageId) 
{ 
//... add to dictionary of arrays for each messageId 
} 

public void NotifyListeners(int messageId, params object[] arguments) 
{ 
//... loop through listeners for the messageId and call the MessageRaised function for each one 
} 
} 

Maintenant, normalement j'ai un contrôleur de base et il met en oeuvre un objet statique Mediator. Ensuite, tous mes autres contrôleurs en héritent. Si vous utilisez le code et que vous ne pouvez pas hériter, vous pouvez essayer d'utiliser un modèle singleton. Les classes statiques .Net sont plutôt géniales car elles ont un constructeur donc vous pouvez aussi l'utiliser. Donc dans votre cas, j'aurais le code derrière pour chaque outil de contrôle IListener et ensuite dans le constructeur pour chacun, avoir quelque chose comme Mediator.GetInstance(). Register (this, Messages.MyEvent). C'est une manière rapide et sale qui peut être refactorisée un peu dans le futur pour la rendre un peu plus réutilisable.

Certaines ressources d'une recherche rapide Google

http://www.avajava.com/tutorials/lessons/mediator-pattern.html

http://sourcemaking.com/design_patterns/mediator

Bonne chance

1

Vous pouvez utiliser la gestion des événements et des délégués pour cela et avoir votre contrôle récepteur abonnez-vous indirectement à l'événement de votre expéditeur contrôle, VIA le contrôle parent des deux commandes, agissant en tant que multiplexeur.

0

La réponse est simple. Déclarez une méthode dans la seconde forme (celle sans l'événement) avec la bonne signature et marquez-la comme publique.

Dans la forme parente, affectez la méthode de la deuxième forme à l'événement de la première.

0

Oui simplement publier et déclencher un événement et abonnez-vous à partir de votre contrôle auditeur.

Questions connexes