¿Pasar parámetros adicionales a un controlador de eventos?

Resuelto Andy Hin asked hace 14 años • 10 respuestas

Digamos que quiero pasar algunos datos adicionales al asignar un controlador de eventos. Considere el siguiente código:

private void setup(string someData)
{
     Object.assignHandler(evHandler);
}

public void evHandler(Object sender)
{
    // need someData here!!!
}

¿ Cómo haría para entrar someDataen mi evHandlermétodo?

Andy Hin avatar Nov 18 '10 21:11 Andy Hin
Aceptado
private void setup(string someData)
{
     Object.assignHandler((sender) => evHandler(sender,someData));
}
public void evHandler(Object sender, string someData)
{
    // need someData here!!!
}
spender avatar Nov 18 '2010 14:11 spender

Me costó mucho entender el ejemplo anterior de @spender, especialmente con: Object.assignHandler((sender) => evHandler(sender,someData));porque no existe tal cosa Object.assignHandleren el sentido literal. Así que busqué un poco más en Google y encontré este ejemplo . La respuesta de Peter Duniho fue la que hizo clic en mi cabeza (este no es mi trabajo):

recorte

El enfoque habitual es utilizar un método anónimo con un controlador de eventos que tenga su firma modificada. Por ejemplo:

void Onbutton_click(object sender, EventArgs e, int i) { ... }

button.Click += delegate(object sender, EventArgs e) 
{ Onbutton_click(sender, e, 172); };

Por supuesto, no es necesario pasar 172, ni siquiera convertir el tercer parámetro en un int. :)

/recorte

Usando ese ejemplo pude pasar dos ComboBoxItemobjetos personalizados a un Timer.Elapsedevento usando notación lambda:

simulatorTimer.Elapsed +=
(sender, e) => onTimedEvent(sender, e,
(ComboBoxItem) cbPressureSetting.SelectedItem,
(ComboBoxItem) cbTemperatureSetting.SelectedItem);

y luego en su controlador:

static void onTimedEvent(object sender, EventArgs e, ComboBoxItem pressure, ComboBoxItem temperature)
    {
        Console.WriteLine("Requested pressure: {0} PSIA\nRequested temperature: {1}° C", pressure, temperature);
    }

Este no es ningún código nuevo de los ejemplos anteriores, pero demuestra cómo interpretarlos. Ojalá alguien como yo lo encuentre instructivo y útil para no pasar horas tratando de entender el concepto como lo hice yo.

Este código funciona en mi proyecto (excepto por una excepción que no es segura para subprocesos con los ComboBoxItemobjetos que no creo que cambien el funcionamiento del ejemplo). Me estoy dando cuenta de eso ahora.

delliottg avatar Jan 05 '2016 22:01 delliottg