我知道如何使用事件和委托将数据从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订阅事件。但这不是我想要的。然后,我会有很多其他形式的代表和活动,称之为形式2。
由于您的第一个表单正在创建第二个表单的实例并"拥有"该实例,因此Form2
上的方法(根据当前进度将UI更新为public
)以及调用该方法的其他表单调用该方法是合适的设计。Form2
也根本不需要有event
,因为它不是通知其他形式发生了什么事情的那个。
在这种情况下,当创建一个设计文档来指示这些表单之间的关系时,我们可以说Form1
或其他表单具有Form2
。HAS-A关系在这里是有意义的。对于Form2
,它的目标只是根据另一个类提供的信息显示进度,因此为另一个类别提供一个公共方法来告诉它显示进度是正确的。
你错过了一段颠倒的关系。如果子窗体需要向父窗体通知某件事,那么Form2
将有一个事件,在该事件的处理程序中,创建它的窗体(即Form1
)通常会在处理程序中调用它们自己的私有方法,或者可能访问Form2
的其他公共方法来从中提取或推送数据。
这里的想法是Form1
"了解"Form2
是合适的。它应该参考它,并了解它公开披露的内容。然而,Form2
不应该知道关于创建它的窗体的任何信息。它应该能够显示任何窗体的进度,这些进度可以告诉它要显示的进度。如果它需要接受对Form1
的引用或了解它的任何信息,那么这是不可能的。通过在Form2
上使用一个事件,当它需要将信息out传递给创建它的窗体时,它可以避免需要知道那是什么窗体。