2009-04-26 14 views
7

Si actions es un Panel, ¿puedo plantear el evento Click de su padre? Tengo este código por el momento, pero el evento Click no es un método, por lo que este código no es válido.
¿Alguien sabe cómo puedo lograr esto?Criar eventos externos en C#

actions.Click += delegate(object Sender, EventArgs e) 
{ 
    ((Panel)Sender).Parent.Click(); 
} 

Respuesta

9

No es posible elevar un C# event directamente desde otro class (incluso si es public). Puede proporcionar un método (con un modificador de acceso suficiente) que eleve el event en su nombre y llame a ese método en el otro class.

Por cierto, esto es posible con la reflexión, pero considero que es un hack sucio.

+0

¿Podría crear una nueva clase Panel de las hereda el viejo, y luego añadir un método para elevar el evento Click ? –

+0

Sí. Debes hacer eso. –

+0

Lo siento, no es un truco sucio, tiene su lugar en AoP para que no escriba NotifyPropertyChanged para cada propiedad de su clase y en el proceso que satura su modelo. – Alwyn

1

Dependiendo de la infraestructura que utilice, es posible que no tenga que invocar manualmente el evento click en la matriz, WPF y ASP.NET, por ejemplo, eventos de burbuja en el árbol de elementos.

Si no es una opción, puede hacer lo que Mehrdad sugiere.

6

La mayoría de los tipos en el CLR que genera eventos tiene un método On [EventName] protegido que se encarga de plantear el evento. Puede invocar este método protegido "desde fuera" por medio de la reflexión:

Control parent = ((Control)sender).Parent; 
Type parentType = parent.GetType(); 
MethodInfo onClickMethod = parentType.GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic); 

onClickMethod.Invoke(parent, new object[] { e }); 
1

La única razón que se me ocurre de por qué usted quiere provocar el evento Click es si se está simulando la entrada del usuario. ¿Estás trabajando en un controlador de prueba automatizado o algo así? Si es así, puede haber mejores soluciones que manchar el código con métodos auxiliares solo de prueba. This aparece primero en google, no tengo idea si es bueno.

Si está tratando de hacer esto como un tipo de control de flujo en su aplicación en sí, daría un paso atrás para ver si esto es lo correcto: "huele mal". .

+0

Estoy tratando de hacer que el evento Click brote, no estoy usando WPF, por lo que no ocurre automáticamente. –

2

He implementado esto utilizando métodos de reflexión y de extensión de modo que sólo puede invocar (en este caso) un evento de clic LinkLabel con sólo llamar:

var link = new LinkLabel()' 
link.Text = "Some link"; 
link.click(); 

el clic() método es un método # extensión C:

public static void click(this LinkLabel linkLabel) 
{ 
    var e = new LinkLabelLinkClickedEventArgs((LinkLabel.Link)(linkLabel.prop("FocusLink"))); 
    linkLabel.invoke("OnLinkClicked", e); 
} 

que utiliza otros métodos de extensión a:

  • obtener una propiedad privada de la LinkLa Bel (necesario para crear el objeto LinkLabelLinkClickedEventArgs)
  • invocar el método OnLinkClicked (que se disparará el evento