Para crear un nuevo controlador de eventos en un control, puede hacer esto
c.Click += new EventHandler(mainFormButton_Click);
o esto
c.Click += mainFormButton_Click;
y para eliminar un controlador de eventos puedes hacer esto
c.Click -= mainFormButton_Click;
Pero, ¿cómo se eliminan todos los controladores de eventos de un evento?
c.Click = null
?Clear
AparentementeRespuestas:
Encontré una solución en los foros de MSDN . El siguiente código de muestra eliminará todos los
Click
eventos debutton1
.fuente
RemoveClickEvent
comenzar la primera línea conFieldInfo f1 = typeof(Button)
:? Me pongo nuloGetField
si usoControl
.ObservableCollection.CollectionChanged += null;
Ustedes están haciendo este CAMINO demasiado difícil para ustedes mismos. Es así de fácil:
fuente
FindClicked = null;
que es bastante más simple.kinect.ColorFrameReady -= MyEventHander
, pero no existe unGetInvocationList()
método en las instancias de Kinect para iterar sobre sus delegados.GetInvocationList
extraviado.Desde la eliminación de todos los controladores de eventos :
fuente
La respuesta aceptada no está completa. No funciona para eventos declarados como {add; eliminar;}
Aquí está el código de trabajo:
fuente
BindingFlags.Public
en la primeraGetField
llamada.No hace ningún daño eliminar un controlador de eventos no existente. Entonces, si sabe qué controladores pueden existir, simplemente puede eliminarlos todos. Acabo de tener un caso similar. Esto puede ayudar en algunos casos.
Me gusta:
fuente
De hecho, estoy usando este método y funciona perfectamente. Me 'inspiró' el código escrito por Aeonhack aquí .
El campo MyEventEvent está oculto, pero existe.
Depuración, puede ver cómo
d.target
el objeto realmente maneja el evento, yd.method
su método. Solo tienes que eliminarlo.Funciona muy bien No más objetos que no se GC'ed debido a los controladores de eventos.
fuente
Odiaba las soluciones completas que se muestran aquí, hice una mezcla y probé ahora, trabajé para cualquier controlador de eventos:
¡Fácil! Gracias por Stephen Punak.
Lo usé porque utilizo un método local genérico para eliminar los delegados y el método local se llamó después de diferentes casos, cuando se establecen diferentes delegados.
fuente
Si realmente tiene que hacer esto ... se necesitará reflexión y bastante tiempo para hacerlo. Los controladores de eventos se administran en un mapa de evento a delegado dentro de un control. Necesitarías
En resumen, mucho trabajo. Es posible en teoría ... Nunca intenté algo como esto.
Vea si puede tener un mejor control / disciplina sobre la fase de suscripción-cancelación de la suscripción para el control.
fuente
Stephen tiene razón. Es muy fácil:
fuente
foreach (EventHandler<MyCompletedArgs> handler in CompletionCompleted.GetInvocationList())
{
CompletionCompleted -= handler;
}
Acabo de encontrar Cómo suspender eventos al configurar una propiedad de un control WinForms . Eliminará todos los eventos de un control:
fuente
Guau. Encontré esta solución, pero nada funcionó como quería. Pero esto es muy bueno:
fuente
Esta página me ayudó mucho. El código que obtuve de aquí estaba destinado a eliminar un evento de clic de un botón. Necesito eliminar eventos de doble clic de algunos paneles y hacer clic en eventos de algunos botones. Así que hice una extensión de control, que eliminará todos los controladores de eventos para un evento determinado.
Ahora, el uso de esta extensión. Si necesita eliminar eventos de clic de un botón,
Si necesita eliminar eventos de doble clic de un panel,
No soy un experto en C #, así que si hay algún error, por favor perdóname y házmelo saber.
fuente
A veces tenemos que trabajar con los controles de ThirdParty y necesitamos construir estas soluciones incómodas. Basado en la respuesta de @Anoop Muraleedharan, creé esta solución con el tipo de inferencia y el soporte ToolStripItem
Y puedes usarlo así
fuente
Encontré otra solución de trabajo de Douglas .
Este método elimina todos los controladores de eventos que se establecen en un evento de ruta específico en un elemento.
Úselo como
Código completo:
fuente
elimina todos los controladores para el botón: save.RemoveEvents ();
fuente
Bueno, aquí hay otra solución para eliminar un evento asociado (si ya tiene un método para manejar los eventos para el control):
fuente
Esta no es una respuesta al OP, pero pensé en publicar esto aquí en caso de que pueda ayudar a otros.
fuente
Encontré esta respuesta y casi se ajusta a mis necesidades. Gracias a SwDevMan81 por la clase. Lo modifiqué para permitir la supresión y reanudación de métodos individuales, y pensé en publicarlo aquí.
fuente