2013-05-24 3 views
8

Ich muss eine Referenz einer Funktion an eine andere Funktion in VB.NET übergeben. Wie kann das gemacht werden?AddressOf zu einer Funktion in VB.NET übergeben, um AddHandler zu verwenden

Meine Funktion muss AddHandler intern verwenden, für die ich eine Handler-Funktion übergeben muss. Mein Code unten funktioniert offensichtlich nicht, aber er vermittelt die Idee von dem, was ich brauche.

Public Function CreateMenuItem(ByVal Name As String, ByRef Func As AddressOf) As MenuItem 
    Dim item As New MenuItem 

    item.Name = Name 
    'item. other options 

    AddHandler item.Click, AddressOf Func 

    Return item 
End Function 

Gibt es eine andere Möglichkeit, dies zu tun? Der AddHandler muss irgendwie auf einen übergebenen Parameter in einer Funktion gesetzt werden ...

+0

'Addressof' gibt einen Delegierten. Ihre Funktion sollte daher den angegebenen Delegaten als Parametertyp akzeptieren. – asawyer

Antwort

1

Als erstes müssen Event-Handler Subs haben. Zweitens kann AddressOf nicht als ein Typ verwendet werden. Wenn die Unterklasse in derselben Klasse ist, verwenden Sie einfach den Unternamen. Wenn es sich in einer anderen Klasse/Datei befindet, müssen Sie möglicherweise die Unteröffentlichkeit veröffentlichen und/oder als Mitglied der anderen Klasse qualifizieren. Subs für die AddHandler-Klausel muss folgen grundsätzlich das Muster:

Public/Private Sub MyHandler(sender As Object, e As EventArgs) 

Wenn Sie verschiedene Routinen müssen basierend auf dem Namen des Menüpunktes können Sie einen Handler und rufen Sie die entsprechende Routine basierend auf dem Namen des Elements auslösenden das Ereignis.

+0

Richtig, ich weiß AddressOf kann kein Datentyp sein. Das war nur um die Idee zu vermitteln. Und ich weiß, wie man AddHandler benutzt. Aber wenn wir sagen, dass die Handler-Funktion in einer anderen Klasse ist und CreateMenuItem public ist, wie kann ich die Adresse der Handler-Funktion von dieser Klasse an CreateMenuItem übergeben? Jedes erstellte Menüelement sollte einen anderen Handler haben. Ich möchte vermeiden, einen großen Schalter oder wenn .else Anweisungsliste zu haben. – DieSlower

8

Ihr zweites Argument in der Funktion sollte vom Typ sein EventHandler und Ihre Funktion würde dann wie folgt aussehen:

Public Function CreateMenuItem(ByVal Name As String, ByRef Func As EventHandler) As MenuItem 
    Dim item As New MenuItem 

    item.Name = Name 
    'item. Other options 

    AddHandler item.Click, Func 

    Return item 
End Function 

Jetzt Sie eine Methode benötigen diese Klicks zu handhaben:

Private Sub ItemClick(sender As Object, e As EventArgs) 
    'Do something with that click here 
End Sub 

Und Sie

Dim handler = New EventHandler(AddressOf ItemClick) 
    Dim i = CreateMenuItem("My item", handler) 

    i.PerformClick() 
13

Ein Spaß: diese beiden Methoden nun mit so etwas wie kann verbrauchen ction delegate ist genau das, was Sie dazu brauchen. Zuerst müssen Sie den Delegaten irgendwo in der Klasse definieren. Ändern Sie die Signatur natürlich auf Ihre Veranstaltung.

Public Delegate Sub MyDelegate(sender As System.Object, e As System.EventArgs) 

Ihre Funktion übernimmt den Delegaten als Argument.

Public Function CreateMenuItem(ByVal Name As String, del As MyDelegate) As MenuItem 
    '''' 
    AddHandler item.Click, del 
    '''' 
End Function 

Public Sub MyEventHandler(sender As System.Object, e As System.EventArgs) 
    '''' 
End Sub 

Und hier ist, wie Sie die Funktion aufrufen:

CreateMenuItem(myString, AddressOf MyEventHandler) 
+1

Wenn die AddHandler-Anweisung einen Fehler verursacht, versuchen Sie, den Parameter 'del' als EventHandler anstelle von MyDelegate in CreateMenuItem zu setzen. (Ref. @ Janez Lukan Lösung) – Fil

Verwandte Themen