2009-04-26 8 views
7

Se actions è un pannello, sono in grado di aumentare l'evento Click del genitore? Ho questo codice al momento, ma l'evento Click non è un metodo, quindi questo codice non è valido.
Qualcuno sa come posso ottenere questo?Aumentare gli eventi di oggetti esterni in C#

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

risposta

9

Non è possibile sollevare un C# event direttamente da un altro class (anche se è public). È possibile fornire un metodo (con un modificatore di accesso sufficiente) che solleva lo event per conto dell'utente e lo chiama nell'altro class.

A proposito, questo è possibile con la riflessione, ma io considero un trucco sporco.

+0

Potrei creare una nuova classe Panel le eredita l'uno vecchio, e quindi aggiungere un metodo per generare l'evento Click ? –

+0

Sì. Dovresti farlo. –

+0

Spiacente non è un trucco sporco, ha il suo posto in AoP in modo che tu non scriva NotifyPropertyChanged per ogni proprietà nella tua classe e nel processo ingombrante il tuo modello. – Alwyn

1

A seconda del framework che si sta utilizzando è possibile che non sia necessario richiamare manualmente l'evento click sul genitore, WPF e ASP.NET per esempio gli eventi bubble sull'albero degli elementi.

Se questa non è un'opzione, puoi fare come suggerisce Mehrdad.

6

La maggior parte dei tipi nel CLR che genera eventi ha un metodo On [EventName] protetto che si occupa di aumentare l'evento. È possibile richiamare questo metodo protetta "dal di fuori" utilizzando la riflessione:

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

L'unico motivo che mi viene in mente per il motivo per cui si vorrebbe per generare l'evento Click è se si sta simulando l'input dell'utente. Stai lavorando a un collaudatore automatico o qualcosa del genere? In tal caso, potrebbero esserci soluzioni migliori rispetto a insudiciare il codice con metodi ausiliari di prova. This arriva prima su google, non ho idea se è buono.

Se si sta provando a fare questo come una sorta di controllo di flusso nella propria applicazione, farei un passo indietro per vedere se questa è la cosa giusta da fare a tutti - tipo di "cattivo odore" .

+0

Sto cercando di far comparire l'evento Click, non sto utilizzando WPF, quindi non si verifica automaticamente. –

2

ho implementato questo utilizzando la riflessione e Metodi di estensione in modo che io posso solo richiamare (in questo caso) un evento click LinkLabel semplicemente chiamando:

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

il click() metodo è un metodo # estensione C:

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

che utilizza altri metodi di estensione a:

  • ottenere una proprietà privata dal LinkLa Bel (necessaria per creare l'oggetto LinkLabelLinkClickedEventArgs)
  • invocare il metodo OnLinkClicked (che genera l'evento
Problemi correlati