使用委托和事件将数据从Form1传递到class1

时间:2014-04-14 16:47:25

标签: c# winforms events delegates

我知道如何使用事件和委托从Form2传递数据到Form1(实际上向后)。 但我想知道如何从Form1(主窗体)到Form2适当地做到这一点。 想象一下Form2和一些中心形式,以显示一些进展(带有进度条),这对许多其他形式来说都很常见。

这就是我想要的样子:

public partial class Form2 : Form
{
    public delegate void ProgressEvent(object obj);
    public event ProgressEvent OnProgressShowing;

    public Form2()
    {

    }

    private void ShowingProgress(object obj)
    { 
         //calling this method from Form1
         //But it must be PRIVATE!
    }
}

怎么做?

喜欢?

     Form2 f2 = new Form2();
     f2.OnProgressShowing += new Forms.ProgressEvent(?? ?what to put inside here?? I cannot access a private method on form2 ???);

我知道一个选项是在Form1上创建委托和事件,并将Form1的引用传递给Form2,并从Form2订阅一个事件。但这不是我想要的。然后,我会在每个其他形式中拥有大量代表和事件,这些形式将调用此form2。

1 个答案:

答案 0 :(得分:2)

由于您的第一个表单是创建第二个表单的实例并且"拥有"该实例,Form2上基于当前进度public更新UI的方法的适当的设计,以及其他表单调用它来调用它方法。 Form2根本不需要event,因为它不是通知其他形式发生某事的人。

在这种情况下,在创建设计文档以指示这些表单之间的关系时,我们可以说Form1或其他表单 一个Form2。 HAS-A关系在这里有意义。对于Form2,它的目标只是根据另一个类提供的信息显示进度,因此让另一个类告诉它显示进度的公共方法是正确。< / p>

你错过了逆转的关系。如果子表单需要通知父表单的某些内容,那么Form2会有一个事件,并且在该事件的处理程序中,创建它的表单(即Form1)通常会调用处理程序中自己的私有方法,或者可能访问Form2的其他公共方法来从中提取或推送数据。

这里的想法是Form1适用于&#34;了解&#34; Form2。它适合于引用它,并了解它公开暴露的任何内容。但是,Form2不应该知道任何关于创建它的形式。它应该能够显示任何表单的进度,该表单可以告诉它要显示的进度。如果它需要接受Form1的引用或完全了解它,那么就不会发生。当Form2 上的事件需要将信息 out 传递给创建它的表单时,可以避免需要知道它是什么形式。< / p>

相关问题