2011-11-08 12 views
6

Soy nuevo en C# así que me disculpo si esta es una pregunta novato. Estoy tratando de aclarar la sintaxis o el patrón para manejar eventos en C#.Controladores de eventos en C# - sintaxis/patrón

Así que tengo un objeto FormForm1 y un Button button1 en el formulario. Manejo un evento Click con un método como este en Form1.cs:

private void button1_Click(object sender, EventArgs e) 
{ 
    Debug.WriteLine("click!"); 
} 

que funciona bien. Ahora en otra forma Form2 Tengo un TreeView treeView1, y quiero manejar el evento BeforeExpand. Así que supuse que sería:

private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
{ 
    Debug.WriteLine("Hello!"); 
} 

que de hecho no funciona: este método no se llama cuando amplío un nodo. Pero varias respuestas de SO implican que es la forma de hacerlo, por ejemplo, one.

De todos modos, encontré un enfoque alternativo que funciona para mí. En el formulario, el constructor vincula el controlador de eventos de la siguiente manera:

treeView1.BeforeExpand += new TreeViewCancelEventHandler(anyMethodNameYouLike); 

¿Cuál es la diferencia entre estos dos enfoques? ¿Por qué la sintaxis _event no funciona para una vista en árbol? ¿Hay alguna diferencia entre los tipos de eventos?

Gracias

+1

Así que vamos a ver si lo entiendo: en la versión que no funciona que sólo está definiendo el guía y ¿entonces? ¿No lo estás vinculando en esa versión? – Tudor

Respuesta

5

Supongo que ha hecho doble clic en el botón en el diseñador de Visual Studio. El controlador button1_Click se agregó automáticamente, al igual que creó el controlador BeforeExpand a mano.

Compruebe el archivo de Form1.Designer.cs, encontrará una línea como la siguiente:

this.button1.Click += new System.EventHandler(this.button1_Click); 
+0

Ok, sí, eso es correcto. De hecho, tengo esta línea en Designer.cs. Tiene sentido ahora :) –

4

Lo que tiene es correcto. Debe agregar el controlador al evento como lo hizo en el segundo caso.

Debe haber una línea como esta:

button1.Click += button1_Click; 

(posiblemente con un envoltorio new EventHandler()) en algún lugar de su código Form1, muy probablemente en el archivo .designer.cs.

+0

Ah, sí, sí hay. Gracias vm –

1

La primera sintaxis, que no es la sintaxis en absoluto, es sólo una convención de nomenclatura para controladores de eventos . Lo que está haciendo con la segunda sintaxis es configurar un delegado en un controlador de eventos y agregarlo a ese evento.

Si marca Form1, y hace clic en el botón y mira sus propiedades de eventos, lo más probable es que el evento esté conectado a través del diseñador. Podría hacer lo mismo con TreeView en su formulario, a través del diseñador.

0

Esa es la forma correcta de suscribirse a un evento. El diseñador agrega automáticamente esa línea al archivo .designer.cs cuando se suscribe al evento a través de él.

De cualquier forma, esta línea de código se escribe en alguna parte. La diferencia es que un evento se suscribe a través del diseñador, mientras que el otro se suscribe de forma manual.

1

El sistema de manejo de eventos C# no funciona en ningún tipo de convención de nomenclatura (creo que puede creer que este sea el caso?).No se llamará a un método llamado treeView1_BeforeExpand en el evento BeforeExpand de treeview1 a menos que le indique que llame a ese método en ese evento en particular.

El código de abajo dice "cuando se dispara el evento BeforeExpand, invoque el método anyMethodNameYouLike.

treeView1.BeforeExpand += new TreeViewCancelEventHandler(anyMethodNameYouLike); 

Usted tiene que escribir su método anyMethodNameYouLike.

1

Este link debería ayudar a determinar cómo configurar controladores de eventos específicos para eventos específicos en su diseñador de formularios

+0

Awesome thanks! –

1

En WinForms, puede enlazar manejadores de eventos del diseñador utilizando la caja de herramientas "propiedades" y haciendo clic en el botón de rayos en la parte superior. abre la pestaña de eventos. Simplemente haga doble clic en el nombre de un evento para generar un controlador en su código o seleccione un método existente con la firma correcta en el menú desplegable. Esto realmente generará el código "+ =" para usted en el archivo .designer.

El nombre Control_Event se genera automáticamente. Sin embargo, puede usar cualquier nombre para sus manejadores e incluso registrar más de uno.

+0

Gracias por el consejo v útil –

+0

No hay problema. La gente no parece hablar de esta pestaña en ninguna parte. Cuando comencé con WinForms, ¡pasé casi 6 meses agregando todos mis controladores en el constructor antes de encontrarlo! –

5

Se necesitan las dos cosas:
1) un método que puede manejar el tipo de evento en cuestión. Para una (MSDN) delegado TreeViewCancelEventHandler la firma del método correcto es:

public void MyMethodNameGoesHere(Object sender,TreeViewCancelEventArgs e) 
{ 
    // do some impressive stuff here 
} 

2) hay que registrarse para el evento:

treeView1.BeforeExpand += new TreeViewCancelEventHandler(MyMethodNameGoesHere); 

También es posible usar sólo el nombre del método :

treeView1.BeforeExpand += MyMethodNameGoesHere; 

Y como una última alternativa puede utilizar esta sintaxis 'inline' para funciones pequeñas:

treeView1.BeforeExpand += (sender, e) => 
{ 
    // do a bit of magic here 
}; 

¿Cuál es posiblemente bueno saber es que los registros de controlador No 'pila' (lo siento por la mala redacción, sugerencias de mejora son bienvenidos!). Significado cuando hace lo siguiente que hará no recibir más eventos después de la última línea ha ejecutado:

treeView1.BeforeExpand += MyMethodNameGoesHere; 
treeView1.BeforeExpand += MyMethodNameGoesHere; 
treeView1.BeforeExpand += MyMethodNameGoesHere; 
treeView1.BeforeExpand -= MyMethodNameGoesHere; // note the MINUS sign 
+0

Gracias por una v respuesta integral –

Cuestiones relacionadas