【问题标题】:manually firing the event in c#在 C# 中手动触发事件
【发布时间】:2020-01-02 04:33:01
【问题描述】:

我想使用 c# 手动触发事件。例如,假设我想从 Form B 触发 Form A 的 Form_closure 事件。怎么做??

在得到一些 cmets 之后。我想我需要对此进行更多解释。

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

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

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

谢谢。

【问题讨论】:

    标签: c#


    【解决方案1】:

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

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

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

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

        GlobalNotifier.OnEnvironmentChanged();
    

    而且您也可以在任何您希望收到有关环境已更改的通知的地方订阅此事件。

        public ReportingService()
        {
            GlobalNotifier.EnvironmentChanged += new VoidEventHandler(GlobalNotifier_EnvironmentChanged);
        }
    
        void GlobalNotifier_EnvironmentChanged()
        {
            //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
        }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我的意思是我想在表单 B 中引发表单 A 中的事件。比如说,在表单 B Form_A.FormClosing += new System.Windows.Forms.FormClosingEventHandler(---- --);如果这是正确的,请告诉我如何传递对象和事件参数以形成 A
      • 您可以在公共方法中公开 On...(),但正如 Joel 所说,如果您想手动引发事件而不实际调用 Form.Close(),您可能正在做出了点问题。
      • @darkassassin93,对我的场景给出了更多解释。
      【解决方案3】:

      在我看来,从您的 cmets 看来,您不想引发一个表单的事件从另一个表单;您只想处理另一个表单的事件。

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

      public FormA TheOtherForm { get; set; }
      

      您将该属性设置为 FormA 的实例,然后按照 cmets 中的说明添加事件处理程序。

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

      【讨论】:

      • Form_A.FormClosing += new System.Windows.Forms.FormClosingEventHandler(------);如果这是正确的,请告诉我如何传递对象和事件参数
      【解决方案4】:

      关闭表单。这将引发事件。如果您想在关闭表单的同时引发事件,那么您做错了;将该代码移至可以从事件和 FormB 调用的单独方法。

      FormAInstance.Close()
      

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

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

      【讨论】:

      • 我的意思是我想在表单 B 中引发表单 A 中的事件。比如说,在表单 B Form_A.FormClosing += new System.Windows.Forms.FormClosingEventHandler(---- --);如果这是正确的,请告诉我如何传递对象和事件参数以形成 A
      • @JoelCoehoorn,对我的场景给出了更多解释。
      • 也许你的术语有误。这听起来有点像您想要订阅listen 事件。举起它意味着不同的东西。
      • 好的,再看一遍你的帖子,我想我现在知道你的问题了。
      猜你喜欢
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多