Belirli bir WinForms denetimi için tüm olası olayları açık bir şekilde her olası olay için bir işleyici oluşturmadan listelemenin bir yolu var mı? Örneğin, çeşitli veri bağlama eylemleri sırasında DataGridView ve BindingSource arasında yanan olayların sırasını görmek isteyebilirim.İşlenmekte olan olayları belirlemek için denetimi izleyin.
cevap
Yapabilirsin Yansıma kullanın, ancak çeşitli olay eylemci imzaları nedeniyle biraz zor olacak. Temel olarak, türündeki her olay için EventInfo
'u almanız ve numaralı telefonu aramadan önce hangi temsilci türünün oluşturulacağını öğrenmek için EventHandlerType
özelliğini kullanın. Delegate.CreateDelegate
, normal olay işleyici desenini izleyen her şey için çalışıyor ...
İşte örnek bir uygulama. Herhangi bir kontrol yapmamaya dikkat edin - bir "standart olmayan" olay ile bir şey verirseniz bir istisna atar. Olay arşivlerini de yazdırmak için yansımayı kolayca kullanabilirsiniz.
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);
}
}
}
}
Bunu yapmak için Reflection'ı kullanabileceğinizi düşünüyorum.
Bu yapılamaz. Eğer Taslak'ta birçok sınıfı görüntülemek için Reflektör kullanırsanız olayları ateş ederken ortak bir desen bulabilirsiniz: kimsenin abone ise
// fire event
if (EventDelegate != null)
EventDelegate(eventArgs);
Dolayısıyla etkinlik bile ateş edilmez
Bunun neden yapılmadığını anlamıyorum - yalnızca olayın abone olması gerektiği anlamına gelir. Bunlar arasında büyük bir fark vardır ve * koddaki her etkinliğe * açıkça * abone olur. –
Bence saçları bölüyorsun. Sabit kodlanmış delegeler oluşturarak veya yansıma kullanarak, hala olay işleyicileri ekleyerek 'açıkça' katılıyorsunuz demektir. Benim cevabım, olaylara (yansıma aracılığıyla bile) abone olmak istemediğini, ancak başka bir şekilde olayların sırasını görmek istediğini varsaydı. –
- 1. DOM'da işlenmekte olan olayların listesi
- 2. BoundedCapacity, şu anda TPL Dataflow'da işlenmekte olan öğeleri içeriyor mu?
- 3. Önceden işlenmekte olan bir dosyayı derlemek çıktıyı çıktı
- 4. Özellikte bir değişikliği izleyin
- 5. Ben belirlemek için çalışıyorum
- 6. Dokunma eyleminin sonucu olan Discern contextmenu olayları?
- 7. belirlemek
- 8. MVP'yi Kullanma - Olayları Düzgün Olarak Test Etmek İçin Olayları Kullanma
- 9. Java: Eşdeğerliği belirlemek için harici sınıf?
- 10. Belirli bir işlem için ağ performansını izleyin
- 11. Ayrıca proje dosyaları için de izleyin
- 12. C# programındaki değişiklikler için MySQL tablosunu izleyin?
- 13. UserControl özellik denetimi için çocuk denetimi
- 14. Ağ Yürütücüsünü İzleyin Mac
- 15. Kullanıcı Denetimi için DataSource
- 16. modifikasyon için bir dosya izleyin ve eklenecek içeriğe sahip olun
- 17. Kabuk betikleri için sürüm denetimi
- 18. Kullanıcı Denetim Olayları
- 19. Panel Denetimi Boya Olayı Kullanıcı Denetimi için çalışmıyor
- 20. İstifleme olayları için gem ice_cube
- 21. Olayları işlemek için desen desen
- 22. UiTextField olayları
- 23. Görüntüleme/kamera izleme Uiimageview'i izleyin
- 24. node.js isteği ile yönlendirmeyi izleyin
- 25. Node.js OS sürümünü almak/belirlemek için
- 26. Tabletin yönünü belirlemek için JavaScript algoritması
- 27. İlk tuşu belirlemek için KBDLLHOOKSTRUCT tuşlarını kullanın
- 28. NSDate - Gelecekte bir tarih belirlemek için
- 29. Yönlendirme URL'sini belirlemek için bir yöntem
- 30. Alan adı belirleme politikasını belirlemek için Jackson
Tam olarak aradığım şey! Görünüşe göre ciddi bir okuma yapmalı ve yansıma ile uğraşmam gerek. Teşekkürler! – BikeMrown
Gerçekten çok yardımcı. Teşekkür ederim. –