C# 在c中手动触发事件#

C# 在c中手动触发事件#,c#,C#,我想使用c#手动触发事件。例如,假设我想从表格B中触发表格a的表格U结束事件。如何操作 在得到一些评论之后。我想我需要对此做更多解释 由于我的表单A引用了一个.dll,它在桌面上创建了一个自定义任务栏, 有一种情况需要我关闭表单B中的自定义任务栏。 我已经尝试了表单B中的FormA.Close()。执行此操作时,会从应用程序域中卸载.dll,因此自定义任务栏占用的空间被阻止 但当我单击自定义任务栏中的“关闭”按钮时,情况并非如此。当我这样做的时候,空间被释放了 这就是我想从表单B手动触发表单A关

我想使用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(-----);如果这是正确的,请告诉我如何传递对象和事件参数