在静态类中引发事件

时间:2009-05-19 05:03:22

标签: c# events class static

我有一个窗体,其数据网格绑定到数据表。 单击按钮,数据表将传递给静态类。

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条记录发送一条消息 - “处理记录#....”,以便它显示在表格上。

是否可以从静态类中引发事件?

3 个答案:

答案 0 :(得分:10)

是的,它是可能的,就像非静态类中的事件一样(除了你当然需要声明事件为static)。

请注意,通过这种设计,你可以(至少在理论上)有几个同时调用SaveData的表单,因此该方法的一个实例是引发针对表单A的事件,而另一个实例将引发事件由于事件是静态的,因此所有事件都将被两个表单捕获,因此您可能希望在表单可用于确定事件的特定调用是否有意义的情况下包含信息。 / p> 例如,您可以将自定义的EventArgs类放在一起并传递DataTable,以便侦听代码可以查看它是否是该表单中的DataTable。如果是,则UI将被更新,如果不是,则可以简单地忽略该呼叫。

答案 1 :(得分:3)

是的,您可以从静态类中引发事件。将事件定义为静态。

public static event EventHandler MyEvent;

答案 2 :(得分:0)

如果我错了,请有人纠正我! 我认为,按照惯例,处理事件的委托应使用两个参数声明:

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

但是我只是一个初学者。因此,如果这完全是胡说八道,请告诉我原因。