2011-06-23 21 views
10

He estado buscando una respuesta durante aproximadamente una hora en Google, pero no encontré exactamente lo que estoy buscando.EventHandler con argumentos personalizados

Básicamente, tengo una clase de Ayudante estática que ayuda a realizar muchas cosas que hago con frecuencia en mi aplicación. En este caso, tengo un método llamado "CreateDataContextMenu" que crea un menú contextual en un control TreeView dado.

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

El propietario de TreeView es el control en el que asociaré mi menú contextual.

Luego, más tarde agrego un evento Click para un MenuItem así:

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

El problema que tengo es que quiero pasar "propietario" y "tipo de datos" como argumentos para el evento menuItemFolder_Click.

He intentado lo siguiente:

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) 
{...} 

Pero no funciona en absoluto. Puede ser muy ingenuo de mi parte hacerlo de esa manera, pero todavía no me siento cómodo con el controlador de eventos.

¿Alguna idea sobre cómo podría hacer eso? Mi primera suposición es que necesito crear mi propio EventHandler para este caso específico voy en la dirección correcta con la que

+0

¿No propietario aquí contienen una referencia a la vista de árbol? ¿O se detendría en el menú contextual? – MPelletier

Respuesta

37

debe crear un lambda expression que llama a un método con los parámetros adicionales:.?

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

Este método funciona como un amuleto, es corto y muy eficiente. Cuanto más pregunto, más aprendo :) ¡Muchas gracias, SLaks! – Sasha

+0

Método más claro por ahora. Para aquellos que no están acostumbrados a las expresiones lambda, como yo, tal vez sería una buena idea mostrar que 'remitente' y 'e' también se pueden pasar a YourMethod. –

+0

¿Cómo darse de baja el mismo evento? –

0

honesta admisión en la delantera: no he probado la código a continuación.

Creo que la razón

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

no funcionará es porque en realidad está pasando a System.EventHandler() el resultado de la invocación de menuItemFolder_Click() con los parámetros proporcionados. No está pasando un puntero a la función en sí.

Intenta escribir otra función que implemente los detalles de menuItemFolder_Click(). Vea si algo como

private void menuItemFolder_Click_Helper (object sender, EventArgs e, object Owner, object DataType) { 
// implement details here 
} 

y luego llame a la función desde el menúItemFolder_Click().

0

creo que el código más simple sería la siguiente:

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 
    } 
Cuestiones relacionadas