C'è un modo per elencare tutti gli eventi attivati per specifici controlli di WinForms senza creare esplicitamente un gestore per ogni possibile evento? Ad esempio, potrei voler vedere la sequenza di eventi che si attivano tra un DataGridView e il BindingSource durante varie azioni di associazione dati.Controllare il controllo per determinare gli eventi che vengono generati?
risposta
Si potrebbe utilizzare la riflessione, ma sarà leggermente complicato a causa delle varie firme del gestore eventi coinvolte. Fondamentalmente si dovrebbe ottenere il EventInfo
per ogni evento nel tipo e utilizzare la proprietà EventHandlerType
per determinare quale tipo di delegato creare prima di chiamare AddEventHandler
. Delegate.CreateDelegate
funziona per tutto ciò che segue il normale modello di gestore eventi ...
Ecco un'app campione. Nota che non sta facendo alcun controllo - se gli dai qualcosa con un evento "non standard" genererà un'eccezione. Si potrebbe tranquillamente usare la riflessione per stampare anche gli argomenti dell'evento.
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Reflection;
namespace ConsoleApp
{
class Program
{
[STAThread]
static void Main(string[] args)
{
Form form = new Form { Size = new Size(400, 200) };
Button button = new Button { Text = "Click me" };
form.Controls.Add(button);
EventSubscriber.SubscribeAll(button);
Application.Run(form);
}
}
class EventSubscriber
{
private static readonly MethodInfo HandleMethod =
typeof(EventSubscriber)
.GetMethod("HandleEvent",
BindingFlags.Instance |
BindingFlags.NonPublic);
private readonly EventInfo evt;
private EventSubscriber(EventInfo evt)
{
this.evt = evt;
}
private void HandleEvent(object sender, EventArgs args)
{
Console.WriteLine("Event {0} fired", evt.Name);
}
private void Subscribe(object target)
{
Delegate handler = Delegate.CreateDelegate(
evt.EventHandlerType, this, HandleMethod);
evt.AddEventHandler(target, handler);
}
public static void SubscribeAll(object target)
{
foreach (EventInfo evt in target.GetType().GetEvents())
{
EventSubscriber subscriber = new EventSubscriber(evt);
subscriber.Subscribe(target);
}
}
}
}
Penso che potresti usare Reflection per farlo.
Questo non può essere fatto. Se si utilizza Reflector per vedere un sacco di classi del Framework troverete un modello comune quando spara eventi:
// fire event
if (EventDelegate != null)
EventDelegate(eventArgs);
Quindi l'evento non è nemmeno licenziati se nessuno sta sottoscrivendo ad esso
Non vedo perché questo significa che non può essere fatto, significa solo che l'evento deve essere sottoscritto. C'è una grande differenza tra questo e * esplicitamente * l'iscrizione a ogni evento nel codice. –
Penso che stai dividendo i capelli. O creando dei delegati con codice fisso o usando la reflection, stai ancora "esplicitamente" aggiungendo i gestori di eventi. La mia risposta presupponeva che non volesse sottoscrivere gli eventi (anche attraverso la riflessione), ma voleva vedere la sequenza degli eventi in qualche altro modo. –
- 1. Gli eventi vengono generati, attivati o attivati?
- 2. Elenco degli eventi che vengono generati nel DOM
- 3. Gli shim non vengono generati per i metodi .NET
- 4. Come disabilitare temporaneamente gli eventi generati automaticamente da Visual Studio?
- 5. Qt: gli eventi vengono elaborati in ordine?
- 6. Dove vengono memorizzati gli eventi di WordPress?
- 7. GCM/APNS Come vengono generati gli ID di registrazione
- 8. Gli eventi non vengono attivati all'interno delle caselle Angular2
- 9. Come gestire gli eventi di dominio generati dai gestori di eventi?
- 10. Binding Jquery Eventi On elementi generati attraverso altri eventi
- 11. La casella di controllo selezionata e gli eventi non selezionati vengono attivati quando seleziono un expander
- 12. jQuery.on() funziona per gli elementi che vengono aggiunti dopo la creazione del gestore eventi?
- 13. Controllo del modo in cui i dati del test vengono generati in QuickCheck
- 14. Determinare se vengono utilizzati gli assembly di GAC e NGen
- 15. In che modo Android gestisce gli eventi della GUI?
- 16. Gli eventi di clic non vengono visualizzati in RecyclerView
- 17. Link/icone che vengono generati in codebehind non vengono visualizzati su alcuni dispositivi mobili
- 18. come vengono generati i numeri di inode in linux tmpfs?
- 19. Gli eventi di Backbone.js non vengono riconosciuti in IE8
- 20. Per curiosità: come vengono generati i numeri seriali? Suggerimenti, algoritmi?
- 21. Gli eventi della tastiera non vengono attivati nell'app RT
- 22. DoDragDrop disattiva gli eventi MouseMove
- 23. Swift: valore che modifica gli eventi di controllo che non chiamano?
- 24. Perché gli eventi tattili stanno distruggendo il mio framerate Android?
- 25. Controllo dei dati in NHibernate usando gli eventi
- 26. Controllo browser Web: come acquisire gli eventi del documento?
- 27. Safari che non attiva gli eventi tattili
- 28. L'iscrizione agli eventi DTE non sembra funzionare - Gli eventi non vengono chiamati
- 29. Backbone Eventi: registrazione di tutti gli eventi quando essi vengono attivati
- 30. Windows Phone 7 Controllo WebBrowser ingoia gli eventi di manipolazione?
Esattamente quello che stavo cercando! Sembra che ho bisogno di leggere seriamente e armeggiare di riflessioni. Grazie! – BikeMrown
Molto utile, davvero. Grazie. –