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



我知道如何使用事件和委托将数据从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传递给创建它的窗体时,它可以避免需要知道那是什么窗体。

最新更新