我有一个Windows窗体,其中的数据网格已绑定到数据表。单击按钮,数据表将传递到静态类。
private void btnSave_ItemClick(object sender, EventArgs e)
{
MyStaticClass.SaveData(DataTable dt);
}
internal static class MyStaticClass
{
internal static void SaveData(DataTable dt)
{
foreach(DataRow dr in dt.rows)
{
// do something
}
}
}
我需要将状态信息从SaveData方法传递回我的表单,以便通知用户如何处理记录。
例如,我想每100条记录发送一条消息-“处理记录#....”,以便将其显示在表单上。
是否可以从静态类引发事件?
是的,它是可能的,并且就像非静态类中的事件一样起作用(当然,除了您需要将事件声明为static
之外。]
尽管请注意,通过这种设计,您可以(至少在理论上)同时具有几种调用SaveData
的表单,因此该方法的一个实例正在引发针对Form A的事件,而另一实例将引发针对Form A的事件。 B.由于事件是静态的,因此所有事件都将被这两种形式捕获,因此您可能希望在事件中包含一些信息,以便表单可以用来确定是否对该事件的特定调用感兴趣。
例如,您可以将一个自定义EventArgs类放在一起,并在其中传递DataTable
,以便侦听代码可以查看它是否是该表单中的DataTable。如果是,则将更新UI,如果不是,则可以简单地忽略该调用。
是的,您可以从静态类中引发一个事件。将事件定义为静态。
public static event EventHandler MyEvent;
如果我错了,请有人纠正我!我认为,按照惯例,处理事件的委托应使用两个参数声明:
public delegate void SomethingHappenedEventHandler(object sender, EventArgs args);
通常,发件人对象是“ this”,但是在静态类中,没有诸如“ this”之类的东西:-(因此,我创建了一个空的虚拟发件人对象以与事件一起发送,以使其兼容与所有其他EventHandlers一起使用。
//Events: public delegate void SomethingHappenedEventHandler(object sender, EventArgs args); //1. Define a delegate public static event SomethingHappenedEventHandler SomethingHappened; //2. Define an event based on that delegate private static void OnSomethingHappened() { Object sender = new Object(); SomethingHappened?.Invoke(sender, EventArgs.Empty); //3. raise the event
但是我只是一个初学者。因此,如果这完全是胡说八道,请告诉我原因。