静态类中的引发事件

问题描述 投票:7回答:3

我有一个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条记录发送一条消息-“处理记录#....”,以便将其显示在表单上。

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

c# events class static
3个回答
10
投票

是的,它是可能的,并且就像非静态类中的事件一样起作用(当然,除了您需要将事件声明为static之外。]

尽管请注意,通过这种设计,您可以(至少在理论上)同时具有几种调用SaveData的表单,因此该方法的一个实例正在引发针对Form A的事件,而另一实例将引发针对Form A的事件。 B.由于事件是静态的,因此所有事件都将被这两种形式捕获,因此您可能希望在事件中包含一些信息,以便表单可以用来确定是否对该事件的特定调用感兴趣。

例如,您可以将一个自定义EventArgs类放在一起,并在其中传递DataTable,以便侦听代码可以查看它是否是该表单中的DataTable。如果是,则将更新UI,如果不是,则可以简单地忽略该调用。


3
投票

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

public static event EventHandler MyEvent;

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

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

© www.soinside.com 2019 - 2024. All rights reserved.