在c#中手动触发事件

Anu*_*uya 4 c#

我想使用c#手动触发事件.例如,假设我想从表单B中激活表单A的Form_closing事件.怎么做?

得到一些评论后.我想我需要对此进行更多解释.

由于我的表单A引用了.dll,它在桌面上创建了一个自定义任务栏,因此我可以从表单B中关闭该自定义任务栏.我已经尝试过表单B中的FormA.Close().这样,.dll将从应用程序域中卸载,因此自定义任务栏占用的空间将被阻止.

但是,当我单击自定义任务栏中的关闭按钮时,情况并非如此.当我这样做时,空间被释放了.

这就是我想从表格B手动触发表格A的关闭事件的原因,这将解决我的问题.

谢谢.

Evg*_*eny 13

我们在一个项目中做了以下事情:

有一个GlobalNotifier类,它定义了我们想要在应用程序的不同模块中使用的事件,就像这样

public static class GlobalNotifier
{

    public static event VoidEventHandler EnvrionmentChanged;

    public static void OnEnvrionmentChanged()
    {
        if (EnvrionmentChanged != null)
        {
            EnvrionmentChanged();
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

然后,当您需要让应用程序的其余部分知道环境已更改时,您可以在任何地方引发此事件,如下所示

    GlobalNotifier.OnEnvrionmentChanged();
Run Code Online (Sandbox Code Playgroud)

此外,您可以在任何想要通知环境已发生变化的通知的地方订阅此事件.

    public ReportingService()
    {
        GlobalNotifier.EnvrionmentChanged += new VoidEventHandler(GlobalNotifier_EnvrionmentChanged);
    }

    void GlobalNotifier_EnvrionmentChanged()
    {
        //reset settings
        _reportSettings = null;
    }
Run Code Online (Sandbox Code Playgroud)

因此,每当您更改环境时,您都会发起事件,并且所有需要了解该事件并执行某些操作的人都会收到通知.可能类似于您需要实现的目标.

此外,如果您需要传递参数,您可以按照自己喜欢的方式定义事件,基本上 -

    public static event VoidEventHandler<SomeObject, List<OtherObject>> SomethingUpdated;

    public static void OnSomethingUpdated(SomeObject sender, List<OtherObject> associations)
    {
        if (SomethingUpdated != null)
        {
            SomethingUpdated(sender, associations);
        }
    }

    // ...

    MyClass.SomethingUpdated+= new VoidEventHandler<SomeObject, List<OtherObject>>(MyClass_SomethingUpdated);

    // ...

    void MyClass_SomethingUpdated(SomeObject param1, List<OtherObject> param2)
    {
      //do something
    }
Run Code Online (Sandbox Code Playgroud)