C# 在c中手动触发事件#
我想使用c#手动触发事件。例如,假设我想从表格B中触发表格a的表格U结束事件。如何操作 在得到一些评论之后。我想我需要对此做更多解释 由于我的表单A引用了一个.dll,它在桌面上创建了一个自定义任务栏, 有一种情况需要我关闭表单B中的自定义任务栏。 我已经尝试了表单B中的FormA.Close()。执行此操作时,会从应用程序域中卸载.dll,因此自定义任务栏占用的空间被阻止 但当我单击自定义任务栏中的“关闭”按钮时,情况并非如此。当我这样做的时候,空间被释放了 这就是我想从表单B手动触发表单A关闭事件的原因,这将解决我的问题C# 在c中手动触发事件#,c#,C#,我想使用c#手动触发事件。例如,假设我想从表格B中触发表格a的表格U结束事件。如何操作 在得到一些评论之后。我想我需要对此做更多解释 由于我的表单A引用了一个.dll,它在桌面上创建了一个自定义任务栏, 有一种情况需要我关闭表单B中的自定义任务栏。 我已经尝试了表单B中的FormA.Close()。执行此操作时,会从应用程序域中卸载.dll,因此自定义任务栏占用的空间被阻止 但当我单击自定义任务栏中的“关闭”按钮时,情况并非如此。当我这样做的时候,空间被释放了 这就是我想从表单B手动触发表单A关
谢谢。您可以调用表单类的
OnFormClosing()
方法。您可以对任何具有配对的On…()
方法的事件执行此操作。关闭表单。这将引发事件。如果你想在关闭表单的同时单独发起活动,那你就做错了;将代码移动到一个单独的方法中,您可以从事件和FormB调用该方法
FormAInstance.Close()
从VisualStudio2005(.NET2.0)开始,表单具有自动默认实例。听起来你就是这么用的。您应该知道,此功能的存在主要是为了与VB6向后兼容。您最好创建并使用表单的新实例。当您这样做时,您应该能够在该实例上调用.Close()
方法,而无需关闭应用程序域
如果您想重新使用此空间,您也可以尝试简单地
.Hide()
-ing表单,而不是关闭它。从您的评论中,我觉得您不想从另一个表单引发一个表单的事件;您只需要处理一个窗体与另一个窗体的事件
是的,你能做到<代码>表格B需要有对FormA
的引用。有几种方法可以做到这一点;一种简单的方法是在FormB类中有一个FormA
type属性,如下所示:
public FormA TheOtherForm { get; set; }
将该属性设置为FormA
的实例,然后按照注释中的描述添加事件处理程序
您不必使用
FormA
作为您的财产类型;任何表单都有FormClosing
事件,因此您可以根据需要使用表单作为类型。我们在一个项目中完成了以下操作:
有一个GlobalNotifier类,它定义了我们希望在应用程序的不同模块中使用的事件,如下所示
public static class GlobalNotifier
{
public static event VoidEventHandler EnvironmentChanged;
public static void OnEnvironmentChanged()
{
if (EnvironmentChanged != null)
{
EnvironmentChanged();
}
}
}
GlobalNotifier.OnEnvironmentChanged();
然后,当您需要让应用程序的其余部分知道环境已经改变时,您可以在任何地方引发此事件,如下所示
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
}
公共静态事件VoidEventHandler SomethingUpdated;
SomeThingUpdated上的公共静态无效(SomeObject发件人,列表关联)
{
if(SomethingUpdated!=null)
{
某些更新的内容(发送者、关联);
}
}
// ...
MyClass.SomethingUpdated+=新的VoidEventHandler(MyClass\u SomethingUpdated);
// ...
void MyClass_SomethingUpdated(sometobject参数1,List参数2)
{
//做点什么
}
我的意思是,我想从表格B中提出表格A中的事件。比如,在表格B表格A中提供以下内容。FormClosing+=new System.Windows.Forms.FormClosingEventHandler(-----);如果这是正确的,请告诉我如何将对象和事件参数传递给窗体A@JoelCoehoorn,对我的情况做了更多的解释。也许你的术语错了。听起来你有点想订阅或收听活动。提高它意味着一些不同的东西。好吧,再看一遍你的帖子,我想我现在知道你的问题了。我的意思是我想从表格B中以表格A的形式提出这个事件。比如,在表格B中提供以下内容Form_A.FormClosing+=new System.Windows.Forms.FormClosingEventHandler(-----);如果这是正确的,请告诉我如何将对象和事件参数传递到表单a您可以在公共方法中公开On…(),但正如Joel所说,如果您想在不实际调用form.Close()的情况下手动引发事件,您可能做错了。@darkassassin93,对我的场景给出了更多的解释。Form_A.FormClosing+=new System.Windows.Forms.FormClosingEventHandler(-----);如果这是正确的,请告诉我如何传递对象和事件参数