gpt4 book ai didi

c# - 观察控件以确定被触发的事件?

转载 作者:太空狗 更新时间:2023-10-29 18:30:38 24 4
gpt4 key购买 nike

有没有一种方法可以列出特定 WinForms 控件的所有触发事件,而无需为每个可能的事件显式创建处理程序?例如,我可能想查看在各种数据绑定(bind)操作期间在 DataGridView 和 BindingSource 之间触发的事件序列。

最佳答案

您可以使用反射,但由于涉及各种事件处理程序签名,因此会有些棘手。基本上,您必须为类型中的每个事件获取 EventInfo,并使用 EventHandlerType在调用 AddEventHandler 之前确定要创建的委托(delegate)类型的属性. Delegate.CreateDelegate 适用于遵循正常事件处理程序模式的所有内容......

这是一个示例应用程序。请注意,它没有进行任何检查——如果你给它一些带有“非标准”事件的东西,它会抛出一个异常。您也可以相当轻松地使用反射来打印出事件参数。

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);
}
}
}
}

关于c# - 观察控件以确定被触发的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/701762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com