2009-08-19 12 views
0

J'ai une datagridviewcolumn personnalisée dans laquelle j'ai ajouté un événement. Le problème est que je ne parviens pas à voir qui a souscrit à l'événement de l'objet colonne en cours et à ajouter ces abonnements à l'objet colonne cloné. Je contourne ce problème en demandant au programme appelant de transmettre l'adresse du gestionnaire à un délégué dans la colonne personnalisée, au lieu d'ajouter un gestionnaire à l'événement. Pardonnez ma terminologie, j'espère que vous comprenez ce que j'essaie de dire! En recevant la référence à la méthode, la colonne dataagridview a maintenant le contrôle et peut facilement cloner cette référence.Comment cloner les abonnements aux événements de l'objet est vsnet?

C'est très bien, mais les utilisateurs de contrôles s'attendent à pouvoir s'inscrire à des événements en sélectionnant l'événement dans Visual Studio - qui crée un modèle de la méthode.

Répondre

1

Au moins en C#, vous pouvez avoir des "adders" et des "removers" pour les événements, tels que les getters et les setters pour les propriétés.

Peut-être pouvez-vous utiliser cela pour effectuer un traitement personnalisé au cours du processus d'ajout d'un gestionnaire d'événement à l'événement?

EDIT
Je ne sais pas beaucoup sur VB.NET, mais je googlé un peu et trouvé l'extrait suivant:

Public Delegate Sub WorkDone(ByVal completedWork As Integer) 
Private handlers As New ArrayList() 

Public Custom Event WorkCompleted As WorkDone 
    AddHandler (ByVal value As WorkDone) 
    If handlers.Count <= 5 Then 
     handlers.Add(value) 
    End If 
    End AddHandler 

    RemoveHandler(ByVal value As WorkDone) 
    handlers.Remove(value) 
    End RemoveHandler 

    RaiseEvent (ByVal completedWork As Integer) 
    If completedWork > 50 Then 
     For Each handler As WorkDone In handlers 
     handler.Invoke(completedWork) 
     Next 
    End If 
    End RaiseEvent 
End Event 

Cela devrait vous aider à personnaliser votre gestionnaire d'événements, de sorte que vous peut "voir" les délégués ajoutés à l'événement depuis votre classe.

+0

Merci, c'est exactement ce que je recherchais. – Jules

0

Pour ceux qui étaient intéressés, j'ai trouvé un moyen d'effectuer cela sans avoir besoin d'un événement personnalisé.

En suffixant le nom de l'événement avec l'événement , vous avez accès à certaines propriétés et méthodes. Donc, dans l'exemple de Thorsten, je qualifierais l'événement de WorkCompleted Event.

Spécifique à cette question, il y a la méthode GetInvocationList qui renvoie une liste de délégués attachés à l'événement. En plus de cela, en vérifiant si WorkCompleted Événement IsNot Nothing, vous indiquera s'il existe des gestionnaires pour l'événement sans avoir à récupérer la liste d'invocation. Eta: Mes italiques apparaissent en tant que '*' lorsque je soumets la publication. Aucune idée pourquoi.