2011-06-23 6 views
10

Szukałem odpowiedzi przez około godzinę w Google, ale nie znalazłem dokładnie tego, czego szukam.EventHandler z niestandardowymi argumentami

Zasadniczo mam statyczną klasę Pomocnika, która pomaga wykonywać wiele rzeczy, które często robię w mojej aplikacji. W tym przypadku mam metodę o nazwie "CreateDataContextMenu", która tworzy menu kontekstowe dla danego kontrolka TreeView.

public static void CreateDataContextMenu(Form parent, TreeView owner, string dataType) 
{ ... } 

Właściciel TreeView to kontrola, w której powiążę moje menu kontekstowe.

Następnie później dodać zdarzenie click do MenuItem tak:

menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click); 

Mam problem tutaj jest, że chcę przejść „właściciela” i „typ danych” jako argumenty przypadku menuItemFolder_Click.

Próbowałem następujące:

menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click(sender,e,owner,dataType)); 
(...) 
private static void menuItemFolder_Click(object sender, System.EventArgs e, Treeview owner, string dataType) 
{...} 

Ale to nie działa w ogóle. Być może jestem naiwny, że robię to w ten sposób, ale nie jestem zbytnio zadowolony z obsługi zdarzeń ..

Każdy pomysł, jak to zrobić? Moim pierwszym przypuszczeniem jest to, że muszę stworzyć własny EventHandler w tym konkretnym przypadku jestem zmierza w dobrym kierunku, z tym

+0

Nie właściciel tutaj zawierają odniesienie do TreeView? A może zatrzymałoby się to w menu kontekstowym? – MPelletier

Odpowiedz

37

należy utworzyć lambda expression który wywołuje metodę z dodatkowych parametrów.?

menuItemFolder.Click += (sender, e) => YourMethod(owner, dataType); 
+2

Ta metoda działa jak urok, jest krótka i bardzo wydajna. Im więcej zadaję, tym więcej się uczę :) Dziękuję bardzo SLaks! – Sasha

+0

Wyraźniejsza metoda. Dla tych, którzy nie są przyzwyczajeni do wyrażeń lambda, takich jak ja, może dobrze byłoby pokazać, że "nadawca" i "e" mogą również zostać przekazani do YourMethod. –

+0

Jak wypisać się z tego samego wydarzenia? –

0

szczery wstęp do góry przód: nie próbowałem kod poniżej:

Myślę, że powodem

menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click(sender,e,owner,dataType)); 

nie zadziała to dlatego, że są faktycznie przechodząc do System.EventHandler() wynik wezwaniem menuItemFolder_Click() z parametrami przewidzianymi. Nie przekazujesz wskaźnika do samej funkcji.

Spróbuj napisać inną funkcję, która implementuje szczegóły menuItemFolder_Click(). Sprawdź, czy coś podobnego do tego, jak coś takiego, jak coś takiego, jak coś takiego, jak coś takiego, jak coś takiego, jak coś takiego, jak coś takiego, jak coś takiego, jak coś takiego, jak coś takiego, jak coś takiego, jak coś takiego, jak coś takiego, jak coś takiego, jak coś takiego, jak coś takiego, jak to, na przykład, a następnie wywołaj funkcję z poziomu menuItemFolder_Click().

0

myślę najprostszy kod byłoby to:

EventHandler myEvent = (sender, e) => MyMethod(myParameter);//my delegate 

    myButton.Click += myEvent;//suscribe 

    private void MyMethod(MyParameterType myParameter) 
    { 
    //Do something 

    //if only one time 
    myButton.Click -= myEvent;//unsuscribe 
    }