我知道如何使用事件和委托从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。
答案 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>