2011-04-28 19 views
5

Esta es probablemente una pregunta muy simple, pero por alguna razón, incluso la manera correcta de búsqueda en la web de la respuesta se me escapa ...evento Click para .Net (Windows Forms) control de usuario

estoy tratando para crear un control de usuario que consta de algunas etiquetas y barras de progreso. Sin embargo, quiero que todo el control tenga un evento "Click" que se genera sin importar en qué elemento dentro del control se haga clic. He creado un procedimiento de "handleClick" que se asigna a cada control:

private void HandleClick(object sender, EventArgs e) 
    { 
     // Call the callback function, if we were asked to 
     if (OnClick != null) 
     { 
      EventArgs ee = new EventArgs(); 
      OnClick(this, ee); 
     } 
     else 
     { 
      MessageBox.Show("OnClick was null!"); 
     } 
    } 

OnClick en este caso es una variable definida en el nivel de control:

public new event EventHandler OnClick; 

Ahora bien, esto sólo funciona correctamente en el formar. En una etiqueta, muestra el MessageBox y luego llama al evento en el formulario adjunto. Todo el resto muestra el cuadro de mensaje.

Tengo la sensación de que esto debería ser obvio, pero una tarde de frustración me ha hecho sentir que me estoy perdiendo algo que debería ser evidente, pero cuando lo vea me voy a sentir como un completo bufón. .. ¿Alguien puede dejar de reírse de mi locura el tiempo suficiente para aclararme dónde me he equivocado?

+0

Debe registrar el mismo evento de clic para cada uno de los controles. También llama a ese evento cuando se hace clic en el control del usuario. –

+0

En caso de que esté interesado, este post ayudado a resolver es: http://stackoverflow.com/questions/1071579/user-control-click-windows-forms Básicamente, retire handleClick, y la propiedad y sustituir éste lugar : \t \t nuevo manejador de sucesos evento público click \t \t { \t \t \t añadir \t \t \t { \t \t \t \t base.Click + = valor; \t \t \t \t foreach (control de control en los controles) \t \t \t \t {control de \t \t \t \t \t.Haga clic en + = valor; \t \t \t \t} \t \t \t} \t \t \t eliminar \t \t \t { \t \t \t \t base.Click - = valor; \t \t \t \t foreach (control de control en los controles) \t \t \t \t { \t \t \t \t \t control.Click - = valor; \t \t \t \t} \t \t \t}} \t \t –

Respuesta

10

Lo siento por esto - sólo poner una respuesta sobre si alguien googles que ...

En caso de que esté interesado, este puesto ayudó a resolverlo: User Control Click - Windows Forms ... Básicamente, retire handleClick, y la propiedad y el sustituto este en su lugar:

public new event EventHandler Click 
{ 
    add 
    { 
     base.Click += value; 
     foreach (Control control in Controls) 
     { 
      control.Click += value; 
     } 
    } 
    remove 
    { 
     base.Click -= value; 
     foreach (Control control in Controls) 
     { 
      control.Click -= value; 
     } 
    } 
} 
+0

Muchas gracias, exactamente lo que estoy buscando. – Kingpin

+1

Debe aceptar esta respuesta para cerrar esta pregunta –

+1

¡Gracias! Tenga en cuenta que debe incluir un add/remove recursivo para los controles que están dentro de los controles (por ejemplo, controles dentro de un panel) –

-1

nunca ha intentado esto con Windows Forms, pero en otras interfaces gráficas de usuario He colocado un panel transparente que cubre todo el formulario para que cuando se hace clic "en forma", el evento en realidad va al panel de control.

+0

me está gustando esta idea, pero todavía tendríamos el problema de que sólo funciona cuando se hace clic en el control de usuario subyacente, y no se hace clic en él los controles , si entiendes lo que quiero decir, entonces al agregar el panel probablemente solo tenga un gran control que no se puede hacer clic ... –

Cuestiones relacionadas