我想使用c#手动触发事件。例如,假如我想从表单B中激活表单A的Form_closing事件。怎么做?
得到一些评论后。我想我需要对此进行更多解释。
由于我的表单A引用了.dll,它在桌面上创建了一个自定义任务栏, 我有一种情况可以从表单B关闭该自定义任务栏。 我已经尝试过表单B中的FormA.Close()。当我这样做时,.dll会从应用程序域中卸载,因此自定义任务栏占用的空间被阻止。
但是,当我单击自定义任务栏中的关闭按钮时,情况并非如此。当我这样做时,空间被释放了。
这就是我想从表格B手动触发表格A的关闭事件的原因,这将解决我的问题。
感谢。
答案 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作为类型。