在c#中手动触发事件

时间:2009-09-04 02:00:35

标签: c#

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

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

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

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

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

感谢。

4 个答案:

答案 0 :(得分:13)

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

有一个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<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
    }

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

FormAInstance.Close()

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

如果您想重新使用此空间,您也可以尝试简单地.Hide() - 而不是关闭它。

答案 3 :(得分:1)

对我来说,从您的评论中听起来,就像您不想从另一个表单中提取一个表单的事件一样;你只想从另一个处理一个表格的事件。

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

public FormA TheOtherForm { get; set; }

您将该属性设置为FormA的实例,然后按照您在评论中描述的那样添加事件处理程序。

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