2010-11-04 19 views
11

Tengo un botón de comando en un formulario de win. Por lo tanto, si tengo algo como:¿Cómo puedo saber si un delegado en particular ya ha sido asignado a un evento?

myButton.Click += MyHandler1; 
myButton.Click += MyHandler2; 
myButton.Click += MyHandler3; 

¿Cómo puedo saber si alguno MyHandler particular, ya ha sido añadido al evento Click para que no se añadan de nuevo en otro lugar en mi código?

He leído cómo puede utilizar GetInvocationList() para la información de su propio evento. Pero recibo errores cuando trato de obtener los elementos para mi botón de comando usando varias combinaciones. Dice,

"El evento 'System.Windows.Forms.Control.Click' puede aparecer sólo en el lado izquierdo de + = o -. ="

¿Qué me falta?

[Editar] - Me gustaría acentuar this question que Ahmad señaló. Es un desafío y debería ser más fácil en mi humilde opinión, pero parece que podría funcionar.

+2

No puede. Lo mejor que puede hacer es 'myButton.Click - = MyHandler1' antes de agregarlo. – slugster

+1

posible duplicado de [Determinar la lista de controladores de eventos vinculados al evento] (http://stackoverflow.com/questions/660480/determine-list-of-event-handlers-bound-to-event) –

+0

@Ahmad - Buen ojo. ¡Seguramente no hubiera visto ese! Sin embargo, para mayor claridad, creo que mi pregunta aún es válida. – IAmAN00B

Respuesta

11

Si tiene dudas, si su controlador ya está agregado, simplemente extráigalo y vuelva a agregarlo. Si su controlador no se agregó en primer lugar, simplemente se ignorará su eliminación.

myButton.Click -= MyHandler1; 
myButton.Click += MyHandler1; 

También puede crear un método para adjuntar a un evento y asegúrese de que el código solo se ejecute una vez.

private bool handlersAdded; 
private void AddHandlers() 
{ 
    if (this.handlersAdded) return; 
    myButton.Click += MyHandler1; 
    this.handlersAdded = true; 
} 
+0

no adecuado para eventos estáticos .. – sotn

+0

@sotn ¿Por qué no? Si tienes un evento estático, llamémoslo "StaticClick", aún puedes eliminarlo y agregarle tu controlador: 'MyStaticClass.StaticClick- = MyHandler1;'. Es solo un puntero de método que elimina y/o agrega de/a una lista. De todos modos, nunca utilizaría eventos estáticos, si te encuentras en la necesidad de tal cosa, entonces reconsidera tu diseño. –

+0

Puede que no sea "su" diseño sino un tercero que use. Piense en este ejemplo: desea conectar un controlador de eventos al controlador de sonido de su PC y transmitir algunos datos a varias direcciones IP. Ese controlador de eventos será estático porque no querrá crear múltiples oyentes para cada ip, sino que creará un único detector de eventos y lo transmitirá desde allí (por razones de rendimiento). Lo que sugiere es eliminar ese controlador y volver a conectarlo para cada IP individual. Arriesgado. Espero que entiendas mi punto. – sotn

3

El uso de GetIvocationList solo se puede realizar desde el propietario del evento (myButton en su caso), esa es una de las ideas detrás de los eventos (a diferencia de los delegados).

Como dijo Slugster, no puede verificar la lista de invocación desde fuera de myButton, pero puede probar y eliminar MyHandler # antes de agregarlo.

Cuestiones relacionadas