链接自定义事件以通过多个表单传递回父级

时间:2012-03-10 19:40:35

标签: c# winforms events

我有一个MDImain(Form1),用于处理由孩子生成的自定义事件。当我创建子表单的实例时,我将子事件附加到父处理程序。所有作品都是伟大的父母捕获孩子产生的事件。父母中的代码如下所示。

ChildForm instanceChildForm = new ChildForm();
instanceChildForm.Feedback += new EventHandler<feedback>(MainMessageHandler);

然后我显示子表单...(主消息处理程序是父表单)

现在我希望我的子窗体显示第三个窗体,称之为子窗口2.它是从childForm实例化的,但我希望父MDI仍能捕获此事件。如何让发泄回到mdi父母。

我能想到的只是在主窗体上公开MainMessageHandler例程,但是我仍然需要对主窗体的引用... child3.parent = child2parent然后附加事件如下:

ChildForm2 instanceChildForm2 = new ChildForm2();
instanceChildForm2.Feedback += new EventHandler<feedback>(this.parent.MainMessageHandler);

或类似的东西。

或者这对代表的事情有用吗?如果是这样,我不知道如何解决这个问题。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

有一百万种方法可以做到这一点。在我看来,在任何Windows应用程序中,您需要了解所有表单,它们的状态并能够在它们之间传递消息而不创建依赖项。类似的东西:

public class FormManager
{
    List<Form> _forms = new List<Form>();

    public void CreateForm<T>() where T : Form, new()
    {
        var form = new T();
        _forms.Add(form);
        AttachEvents(form);
        form.Show();
    }

    ...methods for attaching events, responding to them, and DETACHING on form.Closed
}

而不是new()表单,您使用FormManager.CreateForm<Form1>();

现在,当您的某个表单引发某个事件时,您可以访问所有表单,包括父级和子级,您可以决定如何处理该事件。如果您希望它是智能的,您可以在FormManager中做出这些决定,或者您可以将其推送到表单本身。