2009-08-19 6 views
0

Ich habe eine benutzerdefinierte Datagridviewcolumn, in dem ich ein Ereignis hinzugefügt habe. Das Problem ist, ich kann nicht herausfinden, wer das Ereignis des aktuellen Spaltenobjekts abonniert hat, und diese Subskriptionen dem geklonten Spaltenobjekt hinzufügen.Wie klonen Subskriptionen zu Objekt Ereignisse ist vs.net?

Ich umgehen dieses Problem, indem Sie das aufrufende Programm bitten, die Adresse des Handlers an einen Delegaten in der benutzerdefinierten Spalte zu übergeben, anstatt einen Handler zu dem Ereignis hinzuzufügen.

Verzeihen Sie meine Terminologie, ich hoffe, Sie verstehen, was ich versuche zu sagen!

Durch den Verweis auf die Methode hat die DataGridViewColumn nun die Kontrolle und kann diese Referenz dann einfach klonen.

Dies ist in Ordnung, aber Benutzer von Steuerelementen erwarten, in der Lage zu sein, Ereignisse anzukündigen, indem sie das Ereignis in Visual Studio auswählen - was eine Vorlage der Methode erstellt.

Antwort

1

Zumindest in C# können Sie "Addierer" und "Entferner" für Ereignisse haben, wie Getter und Setter für Eigenschaften.

Vielleicht können Sie damit eine benutzerdefinierte Verarbeitung während des Hinzufügens eines Ereignishandlers zum Ereignis durchführen?

EDIT
Ich weiß nicht viel über VB.NET, aber ich gegoogelt ein wenig und fand den folgenden Ausschnitt:

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 

Dies sollten Sie Ihren Event-Handler anpassen helfen, so dass Sie kann die Delegierten, die zum Ereignis hinzugefügt werden, in Ihrer Klasse "sehen".

+0

Danke, das ist genau das, wonach ich gesucht habe. – Jules

0

Für jeden Interessierten stieß ich auf einen Weg, dies ohne die Notwendigkeit eines benutzerdefinierten Ereignisses durchzuführen.

Durch das Suffix des Ereignisnamens mit Ereignis haben Sie Zugriff auf einige Eigenschaften und Methoden. In Thorstens Beispiel würde ich das Ereignis als WorkCompleted Ereignis bezeichnen.

Spezifisch für diese Frage gibt es die Methode GetInvocationList, die eine Liste von Delegaten zurückgibt, die an das Ereignis angehängt sind.

Zusätzlich dazu, zu überprüfen, ob WorkCompleted Ereignis IsNot Nichts, wird Ihnen sagen, ob es Handler für das Ereignis sind, ohne die Aufrufliste abrufen zu müssen.

eta: Meine Kursivschrift wird als '*' angezeigt, wenn ich den Beitrag absende. Keine Ahnung warum.