2009-09-04 146 views
4

我想用c#手动触发一个事件。例如,说如果我想从Form B中触发Form A的Form_closing事件。怎么做?在c中手动触发事件#

得到一些意见后。我想我需要更多地解释这一点。

由于我的A型是参照其会在桌面自定义任务栏上一个.dll, 还有一种情况,我从表B.关闭该自定义任务栏 我已经尝试过FormA.Close()从表单B.当我这样做时,.dll从应用程序域中卸载,并由此导致自定义任务栏占用的空间被阻止。

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

这就是我想从Form B手动发起Form A的close事件的原因,这将解决我的问题。

谢谢。

回答

13

我们做了以下一个项目:

有一个GlobalNotifier类,它定义的事件,我们希望在应用程序的不同模块来使用,这样

public static class GlobalNotifier 
{ 

    public static event VoidEventHandler EnvrionmentChanged; 

    public static void OnEnvrionmentChanged() 
    { 
     if (EnvrionmentChanged != null) 
     { 
      EnvrionmentChanged(); 
     } 
    } 
} 

然后,你可以提高这个事件在任何地方,当你需要让其他应用程序知道环境已经改变,像这样

GlobalNotifier.OnEnvrionmentChanged(); 

而且你也可以su只要你想得到有关环境已经改变的事实的通知,就可以订阅这个活动。

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

    void GlobalNotifier_EnvrionmentChanged() 
    { 
     //reset settings 
     _reportSettings = null; 
    } 

所以,当你改变了环境,你提到的事件,大家谁需要了解这一点,执行一些动作,被通报。 可能与您需要实现的类似。

另外,如果你需要传递参数,你可以定义事件,你喜欢的任何方式,基本上是 - 我的意思是我想从表B.说提高,形式A的事件像

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

您可以调用Form类的OnFormClosing()方法。您可以使用配对的On...()方法进行此操作。

+0

,提供下面的Form B Form_A.FormClosing + = new System.Windows.Forms.FormClosingEventHandler(------);如果这是正确的,请告诉我如何传递对象和事件参数以形成A – Anuya 2009-09-04 02:10:29

+0

您可以在公开方法中公开On ...(),但正如Joel所说,如果您想手动提升事件而不实际调用Form.Close(),你可能做错了什么。 – mgbowen 2009-09-04 02:12:57

+0

@ darkassassin93,给出了我的场景更多的解释。 – Anuya 2009-09-04 02:21:11

1

关闭窗体。这将提高事件。如果您想要将事件与关闭表单分开提出,那么您做错了事;将该代码移到可以从事件和FormB调用的单独方法。

FormAInstance.Close() 

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

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

+0

我的意思是我想要从表单B中提出事件。表格A 如果这是正确的,请告诉我如何将对象和事件参数传递给A – Anuya 2009-09-04 02:09:54

+0

@JoelCoehoorn,给出我的场景的更多解释。 – Anuya 2009-09-04 02:21:47

+0

也许你的术语是错的。这听起来有点像你希望_subscribe_或_listen_参加活动。提高它意味着不同的东西。 – 2009-09-04 02:41:25

1

这听起来对我来说,从你的意见,如你不想提高一个形式的事件从另一个;你只需要处理从另一个窗体的事件。

是的,你可以做到这一点。 FormB需要参考FormA。有几种方法可以做到这一点;一个简单的方法是有一个FormA类型属性在FormB类,像这样:

public FormA TheOtherForm { get; set; } 

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

您不必使用FormA作为您的财产的类型;任何形式都有FormClosing事件,因此如果需要,可以使用Form作为类型。

+0

Form_A.FormClosing + = new System.Windows.Forms.FormClosingEventHandler(------);如果这是正确的,请告诉我如何传递对象和事件参数 – Anuya 2009-09-04 02:34:07