在c#中手动触发事件

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

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

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

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

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

谢谢。

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

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

public static class GlobalNotifier { public static event VoidEventHandler EnvrionmentChanged; public static void OnEnvrionmentChanged() { if (EnvrionmentChanged != null) { EnvrionmentChanged(); } } } 

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

  GlobalNotifier.OnEnvrionmentChanged(); 

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

  public ReportingService() { GlobalNotifier.EnvrionmentChanged += new VoidEventHandler(GlobalNotifier_EnvrionmentChanged); } void GlobalNotifier_EnvrionmentChanged() { //reset settings _reportSettings = null; } 

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

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

  public static event VoidEventHandler> SomethingUpdated; public static void OnSomethingUpdated(SomeObject sender, List associations) { if (SomethingUpdated != null) { SomethingUpdated(sender, associations); } } // ... MyClass.SomethingUpdated+= new VoidEventHandler>(MyClass_SomethingUpdated); // ... void MyClass_SomethingUpdated(SomeObject param1, List param2) { //do something } 

您将调用Form类的OnFormClosing()方法。 您可以对任何具有配对的On...()方法的事件执行此操作。

从你的评论中我听起来就像你不想从另一个表格中提出一个表格的事件; 你只想处理另一个表格的事件。

是的,你可以这样做。 FormB需要引用FormA 。 有几种方法可以做到这一点; 一种简单的方法是在FormB类中使用FormA类型属性,如下所示:

 public FormA TheOtherForm { get; set; } 

您将该属性设置为您的FormA实例,然后添加事件处理程序,如您在注释中所述。

您不必使用FormA作为您的财产类型; 任何表单都有FormClosing事件,因此您可以根据需要使用Form作为类型。

关闭表格。 这将引发这一事件。 如果你想将事件与关闭表单分开,那你就做错了; 将该代码移动到您可以从事件和FormB调用的单独方法。

 FormAInstance.Close() 

从Visual Studio 2005(.Net 2.0)开始,表单具有自动默认实例。 这听起来就像你正在使用的那样。 您应该知道此function主要用于向后兼容VB6。 你最好不要创建和使用表单的新实例。 当你这样做时,你应该只能在该实例上调用.Close()方法而不关闭它的app域。

如果你想重新使用这个空间,你也可以尝试简单。 .Hide()表单而不是关闭表单。